七、文件操作
7.1 文件打开和关闭
-
打开文件
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
-
file
:文件路径 -
mode
:文件打开模式- 文本模式
'r'
:只读模式(默认),文件必须存在。'w'
:写入模式,若文件存在则清空内容,若不存在则创建。'a'
:追加模式,若文件存在则写入到文件末尾,若不存在则创建。'r+'
:读写模式,文件必须存在。'w+'
:写入和读模式,文件存在会清空内容,若不存在则创建。'a+'
:追加和读模式,文件存在时从末尾写入,若不存在则创建。
- 二进制模式:在文本模式后加
'b'
,用于处理非文本文件(如图像、视频)。
- 文本模式
-
buffering
:控制文件的缓冲策略-
0
:无缓冲,仅适用于二进制模式 -
1
:行缓冲,文本模式 -
>1
:设定具体的缓冲区大小,以字节为单位
-
-
encoding
:指定字符编码,例如encoding='utf-8'
-
errors
:错误处理,在遇到无法解码的字符时的处理方式
-
-
关闭文件
file.close()
7.2 上下文管理器操作
-
推荐使用
with
语句管理文件,这样会自动关闭文件。 -
with open('example.txt', 'r') as file: content = file.read() print(content) # 文件会自动关闭
7.3 文件读取
-
read()
:不加参数,则读取文件的所有内容,加数字,代表读取的字符数目。 -
readline()
:每次读取一行内容with open('example.txt', 'r') as file: line = file.readline() # 读取第一行 while line: print(line, end='') # 打印每行内容 line = file.readline() # 继续读取下一行
-
readlines()
:一次性读取所有行,并将其存储在列表中。 -
Python 文件对象本身是一个迭代器,可以直接用于
for
循环逐行读取:with open('example.txt', 'r') as file: for line in file: print(line, end='') # 每次循环读取一行
7.4 文件写入
write()
:将字符串内容写入文件writelines()
:将一个字符串列表写入文件- 文件写入的缓冲:Python 会在文件写入时自动进行缓冲,写入的数据先存储在内存缓冲区,等缓冲区满后再写入磁盘。可以通过
flush()
方法将缓冲区数据立即写入文件 print()
:print("Hello, World!", file=file)
7.5 文件定位和读取控制
- 文件指针:文件指针(File Pointer)是指当前文件操作的位置。每次文件读取或写入时,文件指针会移动,指向文件中的下一个操作位置。
tell()
:返回当前文件指针的位置,以字节为单位。seek(offset, whence)
:移动文件指针offset
:偏移量,以字节为单位whence
:参考位置,0表示文件开头,1表示当前位置,2表示文件末尾
7.6 文件常见操作
- 文件是否存在
os.path.exists("文件路径")
,返回True表示存在。 - 文件是否是普通文件:
os.path.isfile("example.txt")
- 文件是否是目录:
os.path.isdir("example.txt")
- 获取文件大小:
os.path.getsize("example.txt")
,以字节为单位 - 创建目录:
os.mkdir("new_folder")
- 删除文件或目录:
os.remove("example.txt")
- 重命名或移动文件:
os.rename("old_name.txt", "new_name.txt")
- 列出目录中的文件和子目录:
files = os.listdir("some_directory")
- 返回一个列表,没有区分文件还是目录
- 获取文件的元信息
info = os.stat("example.txt")
- st_size:文件的字节大小。
- st_nlink:硬链接数量。
- st_uid:文件所有者的用户 ID。
- st_gid:文件所属组的组 ID。
- 复制文件:
shutil.copy("source.txt", "destination.txt")
- 复制目录:
shutil.copytree("source_folder", "destination_folder")
- 递归复制目录内的文件
- 文件路径操作
- 获取文件名:
os.path.basename(file_path)
- 获取目录路径:
os.path.dirname(file_path)
- 拼接路径:
os.path.join("folder", "file.txt")
,结果是folder/file.txt
- 获取文件名: