大模型学习-python基础Day6
一.文件操作
文件是存储在磁盘上的数据集合。文件可以包含各种类型的数据,如文本、图像、音频等等。
文件系统通过文件名和文件路径来定位和管理文件。文件名通常包含文件的名称和和扩展名。文件路径可以是绝对路径也可以是相对路径。
1.文件的分类
纯文本文件:有统一的编码,可以被看做存储在磁盘上的长字符串。
二进制文件:没有统一的字符编码,由0与1组成。
2.文件的路径
相对路径:从相对路径到指定位置的路径。
绝对路径:从根目录到指定位置的路径。
3.文件的打开和关闭
打开文件
使用open()打开或者创建文件,该方法执行完毕之后返回的是一个file对象
file_object = open(file_path, mode='r', encoding=None)
file_path: 文件路径(绝对或相对路径)mode: 打开模式,常见选项:'r': 只读(默认),文件若不存在不会报错'w': 写入(覆盖原有内容),文件不存在会创建文件'a': 追加写入,文件不存在会创建文件'b': 二进制模式(如'rb')'+': 读写模式(如'r+'),能读能写- ‘x’:创建新文件并且写入,文件若存在会报错
encoding: 指定编码(如'utf-8'),避免乱码
文件关闭方法
file_object.close()
#建立连接(通过open方式打开文件)
file = open("text.txt","w")
#写入数据
file.write("hello world\n")
file.write("ni hao \n")
#关闭连接
file.close()
文件读取
使用内置函数 open() 打开文件,指定文件路径和模式(如 'r' 表示读取)。通过文件对象的 read() 方法获取内容,操作完成后需调用 close() 关闭文件。
file = open('example.txt', 'r')
content = file.read() #如果read(size),加了参数size,表示从文件中读取的字符/字节数
file.close()
readlines和readline
调用 readlines() 方法时,不需要传递参数。它会返回文件中所有行的列表,每行末尾包含换行符 \n。
with open('example.txt', 'r') as file:
lines = file.readlines()
readlines() 方法支持一个可选参数 hint,用于指定读取的字节数。当读取的字节数达到或超过 hint 时,停止读取。若未指定 hint,则读取整个文件。
with open('example.txt', 'r') as file:
lines = file.readlines(100) # 读取大约 100 字节的内容
readline()每次调用只读取一行,返回一个字符串。readlines()一次性读取所有行,返回一个字符串列表。
与 read() 的区别
read()读取整个文件内容,返回一个字符串。readlines()按行分割内容,返回字符串列表。
4.文件操作常用函数
以下是一些常见的文件操作函数及其用途的总结表格:
| 函数/方法 | 用途描述 |
|---|---|
open() |
打开文件,返回文件对象。可以指定模式(如读取、写入、追加等)。 |
close() |
关闭文件,释放系统资源。 |
read() |
读取文件内容,可以指定读取的字节数。 |
readline() |
读取文件的一行内容。 |
readlines() |
读取文件的所有行,返回一个列表。 |
write() |
将字符串写入文件。 |
writelines() |
将字符串列表写入文件。 |
seek() |
移动文件指针到指定位置。 |
tell() |
返回文件指针的当前位置。 |
os.rename() |
重命名文件或目录。 |
os.remove() |
删除文件。 |
os.path.exists() |
检查文件或目录是否存在。 |
os.path.isfile() |
检查路径是否为文件。 |
os.path.isdir() |
检查路径是否为目录。 |
os.path.getsize() |
获取文件的大小(字节)。 |
shutil.copy() |
复制文件到指定路径。 |
shutil.move() |
移动文件或目录到指定路径。 |
shutil.rmtree() |
递归删除目录及其内容。 |
# 打开文件并读取内容
with open('example.txt', 'r') as file:
content = file.read()
print(content)
# 写入文件
with open('output.txt', 'w') as file:
file.write('Hello, World!')
# 检查文件是否存在
import os
if os.path.exists('example.txt'):
print('File exists')
else:
print('File does not exist')
# 复制文件
import shutil
shutil.copy('example.txt', 'backup.txt')
5.部分函数需要导入os模块
os 模块是 Python 中用于与操作系统交互的核心模块,提供了许多文件与目录操作的函数。以下是一些需要导入 os 模块的常用函数及其用途:
一定要执行 import os
os.remove(): 删除指定文件。
os.remove('file.txt')
os.rename(): 重命名文件或目录。
os.rename('old.txt', 'new.txt')
os.mkdir(): 创建单层目录。
os.mkdir('new_folder')
os.makedirs(): 递归创建多层目录。
os.makedirs('path/to/new_folder')
os.getcwd() 不需要任何参数,直接返回当前工作目录的字符串形式。例如:
import os
current_dir = os.getcwd()
print(current_dir)
6.os.walk() 的基本用法
os.walk() 是 Python 中用于递归遍历目录树的函数,返回一个生成器,每次迭代生成一个三元组 (root, dirs, files)。root 是当前遍历的目录路径,dirs是当前目录下的子目录列表,files 是当前目录下的文件列表。
import os
for root, dirs, files in os.walk(os.getcwd()): #os.getcwd()获取文件路径
print(f"当前目录: {root}")
print(f"子目录: {dirs}")
print(f"文件: {files}")
7.文件拷贝
def copy_file(src,dest):
#打开原文件
src_file = open(src,'rb')
#打开目标文件
dest_file = open(dest,'wb')
content = src_file.read(1024)
while content:
dest_file.write(content)
content = src_file.read(1024)
"""
简要写法:
while content := src_file.read(1024)
dest_file.write(content)
"""
#关闭源文件
src_file.close()
#关闭目标文件
dest_file.close()
copy_file(src:"d:\\hug.png" , dest:"e:\\hua.png")
二.面向对象之类和对象
面向过程编程(Procedural Programming)以过程(函数)为核心,强调程序的执行流程。代码由一系列函数组成,每个函数完成特定任务,通过函数调用来组织程序逻辑。
特点:
- 程序结构简单直观,适合解决线性问题。
- 数据与操作分离,函数通常处理外部传入的数据。
- 代码复用通过函数调用实现。
面向对象编程(Object-Oriented Programming, OOP)以对象为核心,将数据和方法封装在对象中。主要特性包括封装、继承和多态。
特点:
- 程序由对象组成,对象包含属性和方法。
- 通过类和实例实现代码复用与扩展。
- 更适合复杂系统建模,提高代码可维护性。
核心概念:
- 封装:隐藏对象内部细节,暴露接口。
- 继承:子类继承父类特性,实现代码复用。
- 多态:同一接口在不同条件下表现不同行为。
面向过程举例:
# 定义计算圆面积的函数
def calculate_area(radius):
return 3.14159 * radius ** 2
# 定义计算圆周长的函数
def calculate_circumference(radius):
return 2 * 3.14159 * radius
# 主程序
radius = float(input("请输入圆的半径: "))
area = calculate_area(radius)
circumference = calculate_circumference(radius)
print(f"圆的面积: {area:.2f}")
print(f"圆的周长: {circumference:.2f}")
面向对象举例:
class Dog:
def __init__(self, name, age):
self.name = name # 实例属性
self.age = age
def bark(self): # 实例方法
print(f"{self.name} says: Woof!")
my_dog = Dog("Buddy", 3) # 创建Dog类的实例
print(my_dog.name) # 输出: Buddy
my_dog.bark() # 输出: Buddy says: Woof!
1.面向对象相关概念
对象:万物皆对象,在自然界中只要是客观存在的事物都是对象
类:类是对大量对象的共性的抽象(关注有什么---属性,能做什么---方法);类是创建对象的模板。
2.定义类
通过 class 关键字定义,用于创建对象。类可以包含属性(变量)和方法(函数)。
class Person:
"""人的类"""
#属性 -- 类属性(所有类创建出来的对象共用)
home = "earth"
#方法
def __init__(self,name,age):
#属性--实例属性(每个类创建出来的对象独有)
self.name = name
self.age = age
def eat(self):
print(f"{self.name} is eating")
说明:
类是对大量共性的抽象,其中主要定义了属性和方法
calss是一个关键字,主要用来标记定义类
person是当前类的类名
类名后的:必须要加
缩进后的内容是类体
属性
类属性:所有类创建出来的对象(实例)共用
实例属性:每个类创建出来的对象独有
方法
实例方法
修改类属性的影响
通过类名修改类属性会影响所有未重写该属性的实例。直接修改实例属性仅影响当前实例。
class Dog:
species = "Canis familiaris"
dog1 = Dog()
dog2 = Dog()
Dog.species = "New species" # 修改类属性
print(dog1.species) # 所有实例同步更新
print(dog2.species)
3.类的操作:成员引用和实例化
成员引用:直接通过类名访问类中的成员
class MyClass:
class_var = "Class Variable" # 类变量
def __init__(self, value):
self.instance_var = value # 实例变量
def instance_method(self):
return self.instance_var
# 类成员引用
print(MyClass.class_var) # 输出: Class Variable
# 实例成员引用
obj = MyClass("Instance Value")
print(obj.instance_var) # 输出: Instance Value
print(obj.instance_method()) # 输出: Instance Value
class Person:
"""人的类"""
#属性 -- 类属性(所有类创建出来的对象共用)
home = "earth"
#方法
def __init__(self,name,age):
#属性--实例属性(每个类创建出来的对象独有)
self.name = name
self.age = age
def eat(self):
print(f"{self.name} is eating")
#类操作
home = Person.home #输出earth
eat_fuc = Person.eat #输出函数<function Person.eat at 0x00002342had22323>
doc = Person.__doc__ #类说明文档
实例化:通过类 创建对象
实例化是创建类的具体对象的过程,通过调用类的构造函数(如 __init__)完成。
- 语法:
object_name = Class_name(arguments),其中arguments传递给构造函数。 - 关键点:
- 实例化时会自动调用
__init__方法初始化对象。 - 每个实例拥有独立的实例变量,类变量被所有实例共享。
- 实例化时会自动调用
class Person:
def __init__(self, name, age):
self.name = name # 实例变量
self.age = age
def eat(self):
print(f"{self.name} is eating")
# 实例化
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)
print(person1.name) # 输出: Alice
print(person2.age) # 输出: 25
person1.eat() #输出Alice is eating
4.__init__方法
在定义类的时候,__init__不是必须的
它主要作用是在创建类的对象时,对对象的属性进行初始化。当你使用类名创建一个新的对象时,python会自动调用它,并将新创建的对象作为第一个参数(通常命名为self)传递给它。
注意:
self:这是一个约定俗成的参数名,它代表类的实例对象本身。在方法内部,通过self可以访问和修改对象的属性。
__init__方法不是必须的。如果类中没有定义,python会使用默认的构造函数,该构造函数不执行任何操作。
__init__方法只能返回none,不能返回其他值。如果尝试返回其他值,会引发typeerror异常
Python 中的 __new__ 和 __init__ 方法
__new__ 和 __init__ 是 Python 中用于对象初始化的两个特殊方法,它们在对象创建过程中扮演不同的角色。
__new__ 方法
__new__ 是一个静态方法,负责创建并返回类的实例。它在 __init__ 之前被调用,通常用于控制实例的创建过程。
class MyClass:
def __new__(cls, *args, **kwargs):
print("__new__ called")
instance = super().__new__(cls)
return instance
__init__ 方法
__init__ 是一个实例方法,负责初始化新创建的对象。它在 __new__ 返回实例后被调用。
class MyClass:
def __init__(self, value):
print("__init__ called")
self.value = value
__init__的第一个参数是self,表示当前实例。- 不需要返回值,默认返回
None。 - 主要用于设置实例的初始属性。
区别对比
| 特性 | __new__ |
__init__ |
|---|---|---|
| 调用顺序 | 先调用 | 后调用 |
| 参数 | cls |
self |
| 返回值 | 必须返回实例 | 无返回值 |
| 主要用途 | 控制实例创建 | 初始化实例属性 |
| 是否必须定义 | 不定义时使用父类的 __new__ |
可选 |
5.self
self作为实例穿参。调用实例方法时候,实例对象会作为第一个参数被传入。因此,我们调用p.eat()相当于调用了Person.eat(p)
class Person:
def __init__(self, name, age):
self.name = name # 实例变量
self.age = age
def eat(self):
print(f"{self.name} is eating")
p = Person(“liujie”)
p.eat() #和Person.eat(p) 一样
通过self在类中调用类的实例属性和实例方法
实例属性通常在 __init__ 方法中定义,并通过 self访问或修改:
class MyClass:
def __init__(self, value):
self.value = value # 定义实例属性
def show_value(self):
print(self.value) # 通过self访问实例属性
self.value是实例属性,每个实例的value可以不同。- 在类的方法中,通过
self.value可以读取或修改该属性。
实例方法通过 self 调用其他实例方法:
class MyClass:
def method1(self):
print("Method 1 called")
def method2(self):
self.method1() # 通过self调用另一个实例方法
print("Method 2 called")
self.method1()调用了同一个类中的method1方法。- 实例方法必须通过
self调用,否则会报错。
实例属性可以在任何实例方法中动态修改:
class Counter:
def __init__(self):
self.count = 0
def increment(self):
self.count += 1 # 修改实例属性
def get_count(self):
return self.count
6.类属性
也叫类变量。在类中方法外定义的属性
通过 类名.属性名 或 实例名.属性名 访问
class Person:
"""人的类"""
#属性 -- 类属性(所有类创建出来的对象共用)
home = "earth"
print(Person.home)
p1 = Person()
print(p1.home)
通过 类名.属性名 添加与修改类属性
class Person:
"""人的类"""
#属性 -- 类属性(所有类创建出来的对象共用)
home = "earth"
print(Person.home) #输出earth
p1 = Person()
print(p1.home) #输出earth
Person.home = "xupu"
print(Person.home) #输出xupu
若用实例名.属性名 则会创建或者修改实例属性,因此不建议类属性和实例属性同名
class Person:
"""人的类"""
#属性 -- 类属性(所有类创建出来的对象共用)
home = "earth"
print(Person.home) #输出earth
p1 = Person()
p1.home = "xupu"
print(p1.home) #输出xupu
p2 = Person()
print(p2.home) #输出earth
所有该类的实例共享同一个类属性
class Person:
"""人的类"""
#属性 -- 类属性(所有类创建出来的对象共用)
home = "earth"
print(Person.home) #输出earth
p1 = Person()
p1.home = "xupu"
print(p1.home) #输出xupu
p2 = Person()
print(p2.home) #输出earth
Person.home = "mars"
print(p1.home) #输出xupu
print(p2.home) #输出mars
7.实例属性
一般在__init__方法中定义实例属性
class Person
def __init__(self,name,age):
self.name = name
self.age = age
def eat(self):
print(""eating)
person1 = Person("liujie",24)
Python 允许在类外部直接为实例添加新属性:
person1.school = uibe # 动态添加属性
print(person1.school) # 输出: uibe
使用 del 关键字可删除实例属性:
del person1.school # 删除属性
8.类的方法
三种方法:实例方法、静态方法、类方法
实例方法:在类中定义,第一个参数为self,代表实例本身;实例方法只能被实例对象调用;可以访问实例属性、类属性、类方法。
class Person:
home = "earth"
def __init__(self,name)
self.name = name
def m2(self):
print("m2222")
def m1(self):
print("self.name")
print(Person.home)
self.m2() #等价于Person.m2()
zs = Person("zs")
zs.m1()
类方法
在类中通过@classmethod定义,第一个参数为cls,代表本身类。
类方法可以被类和实例对象调用
可以访问类属性
在不创建实例的情况下调用,通过类名直接调用,非常方便,适合一些和类整体相关的操作
class Person:
"""human beings"""
home = "earth"
@classmethod
def class_method(cls):
print(cls.home)
print(cls.__doc__)
zs = Person("zs")
Person.class_method() #通过类名可以直接访问类方法
静态方法
在Python中,静态方法是通过@staticmethod装饰器定义的类方法。静态方法不需要访问类实例(self)或类本身(cls),与普通函数类似,但逻辑上属于类的命名空间。
class MathUtils:
@staticmethod
def m1():
print("niu")
# 通过类调用
result = MathUtils.m1() # 输出 niu
# 通过实例调用(不推荐)
util = MathUtils()
result = util.m1() # 输出 niu
9.在类外定义方法
并非必须在类中进行方法定义,也可以将一个函数对象复制给一个类内局部变量
"""例子1"""
def external_method(self):
return "This is an external method"
class MyClass:
pass
# 将外部函数绑定为实例方法
MyClass.external_method = external_method
# 使用
obj = MyClass()
print(obj.external_method()) # 输出: This is an external method
"""例子2"""
def m5(self,x,y)
print(x+y)
class Myc:
f1 = m5
Myc().f1(1,2) #输出3
10.魔法方法
魔法方法(Magic Methods)是 Python 中一类特殊的方法,以双下划线 __ 开头和结尾。它们用于定义类的行为,例如初始化、运算符重载、对象表示等。
常用魔法方法分类
1. 初始化与构造__init__(self, ...):构造函数,在对象创建时调用。__new__(cls, ...):创建实例时调用,通常用于不可变类型的定制。__del__(self):析构函数,在对象销毁时调用。使用del xxx时候,不会执行__del__
2. 对象表示__str__(self):定义对象的字符串表示(str(obj) 或 print(obj))。__repr__(self):定义对象的官方字符串表示(repr(obj))。__format__(self, format_spec):定义对象的格式化输出(format(obj, spec))。
3. 运算符重载__add__(self, other):定义 + 运算符行为。__eq__(self, other):定义 == 运算符行为。__lt__(self, other):定义 < 运算符行为。__getitem__(self, key):定义索引访问 obj[key]。__setitem__(self, key, value):定义索引赋值 obj[key] = value。
4. 上下文管理__enter__(self):定义 with 语句的入口行为。__exit__(self, exc_type, exc_val, exc_tb):定义 with 语句的退出行为。
5. 属性访问__getattr__(self, name):访问不存在的属性时调用。__setattr__(self, name, value):设置属性时调用。__delattr__(self, name):删除属性时调用。
class Vector:
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2 # 隐式调用__add__
class Example:
def __str__(self):
return "字符串表示"
obj = Example()
print(obj.__str__()) # 可行但不推荐
print(str(obj)) # 正确触发__str__的方式
__new__ 是 Python 中用于创建实例的特殊方法,通常用于定制不可变类型或实现单例模式等场景。以下是关于 __new__ 的关键点:
def __new__(cls, *args, **kwargs):
return super().__new__(cls, *args, **kwargs)
cls表示当前类,由 Python 自动传入。- 必须返回一个实例对象(通常是父类的
__new__结果)。
对于不可变类型(如 int, str, tuple),修改行为需在 __new__ 中实现,因为实例创建后无法修改。例如:
class PositiveInt(int):
def __new__(cls, value):
if value <= 0:
raise ValueError("Value must be positive")
return super().__new__(cls, value)
11.动态给实例添加属性与方法
动态给对象添加属性
class MyClass:
pass
obj = MyClass()
obj.new_attribute = "value" # 直接赋值添加属性
动态给类添加属性
class MyClass:
pass
obj = MyClass()
obj.new_attr = "value" # 动态添加实例属性
MyClass.class_attr = "class_value" # 动态添加类属性
print(obj.class_attr) #"class_value"
给实例添加普通方法
普通方法的第一个参数通常是 self,它代表类的实例。通过 self,方法可以访问实例的属性和其他方法。
class MyClass:
def my_method(self, arg1, arg2):
# 方法体
return arg1 + arg2
class Person:
def __init__(self,name = none):
self.name = name
def eat():
print("eating")
p1 = Person("zs")
p1.eat = eat #把函数赋值给p1的eat属性
p1.eat() #打印 eating
给实例添加实例方法
给对象添加的实例方法只绑定在当前对象上,不对其他对象生效,而且需要传入self参数,需要使用types.MethodType(方法名,实例对象)来添加实例方法
import types
class MyClass:
pass
def custom_method(self, arg1, arg2):
print(f"实例属性值: {self.attr}, 参数: {arg1}, {arg2}")
obj = MyClass()
obj.attr = "value" # 添加实例属性
obj.dynamic_method = types.MethodType(custom_method, obj) #动态添加实例方法
obj.custom_method()
12.动态给类添加方法
给类添加的方法对他的对象都生效,添加类方法需要传入cls参数,添加静态方法则不需要
class Person:
home = "earth"
def __init__(self,name = none):
self.name = name
#定义类方法
@classmethod
def come_from(cls):
print(f"来自{cls.home}")
#定义静态方法
@staticmethod
def static_function():
print("static function")
Person.come_from = come_from
person.static_function = static_function
#调用
Person.come_from()
Person.static_function()
13.动态删除属性和方法
del 对象.属性名
delatter(对象,属性名)
class Person:
home = "earth"
def __init__(self,name = none):
self.name = name
P = Person("zs")
del p.name #此时p的这个name属性会被抹除 即没有name这个属性,p还在
del p #此时p不在了
14.__slots__限制实例属性与实例方法
python允许在定义类的时候,定义一个特殊的__slots__变量,来限制该类的实例能添加的属性。使用__slots__可以限制添加实例属性和实例方法,但类属性、类方法和静态方法还可以添加。__slots__仅对当前类生效,对子类无效。
class Person:
__slots__ = ['name', 'age']
p = Person()
p.name = 'Alice' # 允许
p.age = 25 # 允许
p.gender = 'F' # 报错:AttributeError
class Calculator:
__slots__ = ['value']
def __init__(self, value):
self.value = value
c = Calculator(10)
c.add = lambda x: x + c.value # 报错:AttributeError
更多推荐


所有评论(0)