一.文件操作文件是存储在磁盘上的数据集合。文件可以包含各种类型的数据如文本、图像、音频等等。文件系统通过文件名和文件路径来定位和管理文件。文件名通常包含文件的名称和和扩展名。文件路径可以是绝对路径也可以是相对路径。1.文件的分类纯文本文件有统一的编码可以被看做存储在磁盘上的长字符串。二进制文件没有统一的字符编码由0与1组成。2.文件的路径相对路径从相对路径到指定位置的路径。绝对路径从根目录到指定位置的路径。3.文件的打开和关闭打开文件使用open()打开或者创建文件该方法执行完毕之后返回的是一个file对象file_object open(file_path, moder, encodingNone)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 osos.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 Valueclass 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 eating4.__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__调用顺序先调用后调用参数clsself返回值必须返回实例无返回值主要用途控制实例创建初始化实例属性是否必须定义不定义时使用父类的__new__可选5.selfself作为实例穿参。调用实例方法时候实例对象会作为第一个参数被传入。因此我们调用p.eat()相当于调用了Person.eatpclass 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.count6.类属性也叫类变量。在类中方法外定义的属性通过类名.属性名或实例名.属性名访问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) #输出mars7.实例属性一般在__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() # 输出 niu9.在类外定义方法并非必须在类中进行方法定义也可以将一个函数对象复制给一个类内局部变量例子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(xy) class Myc: f1 m5 Myc().f1(1,2) #输出310.魔法方法魔法方法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 arg2class 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 # 报错AttributeErrorclass Calculator: __slots__ [value] def __init__(self, value): self.value value c Calculator(10) c.add lambda x: x c.value # 报错AttributeError