第7章 文件/目录操作
7.1 基本概念
7.1.1 文件的概念
在计算机中,文件是存储在磁盘上的数据集合。文件可以包含各种类型的数据,如文本、图像、音频、视频或程序代码。
在编写程序的时候,数据是以二进制的形式存储在内存的,将数据写到磁盘文件的过程称之为持久化。
7.1.2 文件路径和文件名
文件系统通过文件路径和文件名来定位和管理文件。
(1)文件名通常包含文件的名称和扩展名。扩展名(又称为文件后缀名)用于表示文件的类型(例如 .txt 表示文本文件,.jpg 表示图像文件)。
(2)文件路径可以是绝对路径(从文件系统的根目录开始)或相对路径(相对于当前工作目录)。
-
绝对路径:
- 在windows系统,绝对路径从盘符开始,例如:D:\atguigu\hello.py
- 在Linux、MacOS等其他系统,绝对路径从根目录/开始,例如:/users/hello.py
-
相对路径:
- 在windows系统,不是以盘符开始的都是相对路径,例如:./atguigu/hello.py 或 ../../hello.py
- 在Linux、MacOS等其他系统,不是从根路径/开始的都是相对路径:例如:./atguigu/hello.py 或 ../../hello.py
- ./代表当前路径,../代表上级目录
7.1.3 文件的分类
1、纯文本文件
有统一的编码,可以被看做存储在磁盘上的长字符串。
纯文本文件编码格式常见的有ASCII、ISO-8859-1/Latin1、GB2312、GBK、UTF-8、UTF-16等。
2、二进制文件
没有字符编码的概念,直接由0与1组成。
如图片文件(jpg、png),视频文件(avi)等。
7.2 文件的打开和关闭
7.2.1 open打开文件
open函数的完整形式:
open() 函数会返回一个文件对象,该对象的类型由打开模式决定,我们通过这个对象执行读取、写入等标准文件操作。
- 当以文本模式(
'w'、'r'、'wt'、'rt'等)打开文件时,open()会返回一个TextIOWrapper类型的对象; - 当以二进制模式打开文件时,返回的类会有所不同:
- 以二进制只读模式打开时,返回
BufferedReader对象; - 以二进制写入 / 追加模式打开时,返回
BufferedWriter对象; - 以二进制读写模式打开时,返回
BufferedRandom对象。
- 以二进制只读模式打开时,返回
模式由基础操作符和格式符组合而成,核心基础符 3 个、格式符 2 个,还有扩展符 2 个,组合规则:格式符可省略(默认文本),扩展符按需加。
buffering仅支持整数,分 3 种情况,新手一般无需修改,用默认值 - 1 即可:
errors常用取值:
7.2.2 close关闭文件
7.3 文件读写操作
7.3.1 文件写操作
1、覆盖写

2、追加写
7.3.2 文件读操作
1、read([size])
- read()表示读取文件所有内容
- read([size]) 可以从文件中读取数据,size 表示要从文件中读取的数据的长度。文本文件中换行符也算作一个字符。
2、readLine([size])
- readLine()可以从纯文本文件读取一行
- readLine(size)可以从纯文本文件读取一行中的size个字符。如果一行不够size个字符,只读一行。
3、readLines([size])
- readLines():读取所有行并返回列表
- readLines(size):可以从纯文本文件读取size个字符所在的所有行。例如:第1行有5个字符,第2行有10个字符,第3行有5个字符,size为8则会读取2行。
7.3.3 复制文件
1、使用shutil.copy/shutil.copy2
shutil 是 Python 内置的文件操作工具库。
shutil.copy(src, dst):仅复制文件内容和文件权限;shutil.copy2(src, dst):复制文件内容 + 权限 +元数据(创建时间、修改时间等,更推荐,接近系统复制)。copyfileobj专门为文件对象复制设计,默认分块大小是 8192 字节,可手动设置更大的分块(比如 1024*1024=1MB,大文件建议设 1MB~16MB),进一步提升速度。copy/copy2底层直接依赖copyfileobj实现核心的文件内容复制。
2、使用read(size)
7.4 操作文件和目录
7.4.1 获取文件或目录属性
7.4.2 操作文件
1、创建文件
2、重命名/移动文件
- os.rename
- shutil.move
3、删除文件
7.4.3 操作目录
1、获取当前工作目录
2、切换目录
3、创建目录
3、遍历目录
-
os.listdir:不递归遍历子目录
-
os.walk:递归遍历子目录
示例代码:
5、重命名/移动目录
- os.rename
- shutil.move
6、删除目录
- os.rmdir:删除一级空目录
- os.removedirs:删除多级空目录
- shutil.rmtree:递归删除非空目录(谨慎使用)
7、复制目录
shutil库的copytree()是官方推荐的方法,能递归复制目录下的所有内容,还能保留文件元数据,无需自己写递归逻辑,简单又高效。