
本文主要基于Python3版本进行讲解,为你梳理文件操作的核心知识点。
1. 打开文件:open()函数
要对文件进行读写,首先需要打开文件。Python内置的open()函数用于打开一个文件,并返回一个文件对象。其基本语法如下:
file_object = open(file_name, mode, encoding=None)
file_name:包含文件路径的字符串(可以是绝对路径或相对路径)。
mode:打开文件的模式,决定了你能对文件进行何种操作。
encoding:可选参数,仅在文本模式下使用,用于指定文件的编码格式(如‘utf-8’、‘gbk’等)。如果不指定,则使用平台默认编码(通常为‘utf-8’,但在Windows上可能为‘gbk’)。建议显式指定encoding='utf-8'以保证跨平台一致性。
常用模式:
| 模式 |
描述 |
‘r’ |
只读模式(默认)。读取已存在文件,文件必须存在,否则抛出FileNotFoundError |
‘w’ |
只写模式。如果文件存在,会覆盖原文件;如果文件不存在,则创建新文件 |
‘a’ |
追加模式。如果文件存在,写入的内容会追加到文件末尾;如果文件不存在,则创建新文件 |
‘x’ |
独占创建模式。如果文件已存在,则抛出FileExistsError;如果不存在,则创建并写入 |
‘b’ |
二进制模式(可与其他模式组合,如‘rb’、‘wb'), 处理图片/音频等二进制文件(如 ‘rb’) |
‘t’ |
文本模式(默认,可省略) |
‘+’ |
读写模式(可与其他模式组合,如‘r+’、‘w+’) |
示例:打开文件
# ①. 以只读方式打开一个文本文件,并指定UTF-8编码
f = open('example.txt', 'r', encoding='utf-8')
# ②. 以二进制写入方式打开一个文件(二进制模式不需要encoding参数)
f_bin = open('data.bin', 'wb')
2. 读取文件
文件打开后,可以使用文件对象的以下方法读取内容。
2.1 read(size)
- 读取指定字节数的内容。如果不指定
size或size为负数,则读取整个文件内容。
- 返回字符串(文本模式)或字节串(二进制模式)。
f = open('example.txt', 'r', encoding='utf-8')
content = f.read() # 读取全部内容
print(content)
f.close()
2.2 readline()
- 读取一行内容,包括行尾的换行符
\n。
- 如果到达文件末尾,返回空字符串
’’ 。
f = open('example.txt', 'r', encoding='utf-8')
line = f.readline() # 逐行读取
while line:
print(line, end='') # 避免print自动添加换行
line = f.readline()
f.close()
2.3 readlines()
- 读取所有行,返回一个字符串列表,每个元素是一行(包含换行符)。
f = open('example.txt', 'r', encoding='utf-8')
lines = f.readlines()
for line in lines:
print(line, end='')
f.close()
2.4 直接迭代文件对象
- 文件对象是可迭代的,可以直接在for循环中逐行读取,内存效率高。
f = open('example.txt', 'r', encoding='utf-8')
for line in f:
print(line, end='')
f.close()
3. 写入文件
写入文件前,需要确保文件以写入模式(‘w’、‘a’、‘x’、‘r+’等)打开。
3.1 write(string)
- 将字符串写入文件,返回写入的字符数(文本模式)或字节数(二进制模式)。
- 注意:
write()不会自动添加换行符,需要手动添加\n。
f = open('output.txt', 'w', encoding='utf-8')
num = f.write(“Hello, World!\n”)
print(f”写入了 {num} 个字符”)
f.close()
3.2 writelines(lines)
- 写入一个字符串列表,但不会自动添加换行符,列表中的每个字符串应已包含换行符。
lines = [“第一行\n”, “第二行\n”, “第三行\n”]
f = open('output.txt', ‘w’, encoding=‘utf-8’)
f.writelines(lines)
f.close()
注意:
‘w’ 模式会覆盖原文件内容(新文件会创建)。
- 确保每行结尾添加
\n(否则内容会连在一起)。
4. 关闭文件:close()与with语句
4.1 显式关闭
- 文件操作完成后,必须调用
close()方法关闭文件,释放系统资源。
- 如果忘记关闭,可能导致数据丢失或资源泄露。
f = open('example.txt’, ‘r’, encoding=‘utf-8’)
# 执行读取操作
f.close()
4.2 使用with语句(推荐)
with语句会自动管理文件的关闭,避免资源泄露,即使发生异常也会正确关闭文件。比手动调用 close() 更安全。
- 当文件不存在时,会捕获
FileNotFoundError,避免程序崩溃。
- 语法:
with open(...) as file_object:
with open('example.txt’, ‘r’, encoding=‘utf-8’) as f:
content = f.read()
print(content)
# 离开with块后,文件自动关闭
5. 文件指针操作
文件对象内部维护一个指针,指示当前读写的位置。
5.1 tell():返回当前指针位置(字节数)。
5.2 seek(offset, whence):移动指针。
offset:偏移量。
whence:可选,0表示从文件开头计算(默认),1表示从当前位置计算,2表示从文件末尾计算。
with open('example.txt', ‘r’, encoding=‘utf-8’) as f:
print(f.tell()) # 0
f.read(5)
print(f.tell()) # 5
f.seek(0) # 回到开头
print(f.tell()) # 0
6. 异常处理
文件操作可能引发多种异常,例如文件不存在、权限不足、编码错误等。可以使用try...except...finally捕获并处理异常。
try:
f = open('nonexistent.txt’, ‘r’, encoding=‘utf-8’)
content = f.read()
except FileNotFoundError:
print(“文件不存在,请检查路径!”)
except PermissionError:
print(“没有权限读取文件!”)
except UnicodeDecodeError:
print(“文件编码错误,请检查encoding参数!”)
except Exception as e:
print(f”发生未知错误:{e}”)
finally:
# 确保文件被关闭
if ‘f’ in locals() and not f.closed:
f.close()
结合with语句可以简化异常处理,因为with会自动关闭文件。
try:
with open('nonexistent.txt’, ‘r’, encoding=‘utf-8’) as f:
content = f.read()
except FileNotFoundError:
print(“文件不存在!”)
except UnicodeDecodeError:
print(“文件编码错误!”)
7. 综合示例
下面是一个完整的示例,演示如何读取一个文件的内容,修改后写入另一个文件,并处理可能出现的异常。示例中显式指定了UTF-8编码。
示例:复制文件并添加行号
假设有一个input.txt文件,内容如下(UTF-8编码):
Python is great.
File handling is easy.
Let's learn together.
我们希望生成output.txt,在每一行前添加行号,格式如1: Python is great.。
input_file = ‘input.txt’
output_file = ‘output.txt’
try:
with open(input_file, ‘r’, encoding=‘utf-8’) as infile:
lines = infile.readlines()
# 添加行号
numbered_lines = [f”{i+1}: {line}” for i, line in enumerate(lines)]
with open(output_file, ‘w’, encoding=‘utf-8’) as outfile:
outfile.writelines(numbered_lines)
print(f”处理完成,结果已保存至 {output_file}”)
except FileNotFoundError:
print(f”错误:文件 {input_file} 不存在,请检查路径。”)
except PermissionError:
print(“错误:没有权限读写文件。”)
except UnicodeDecodeError:
print(“错误:文件编码不是UTF-8,请检查源文件编码。”)
except Exception as e:
print(f”发生未知错误:{e}”)
运行后,output.txt的内容应为:
1: Python is great.
2: File handling is easy.
3: Let's learn together.
8. 涉及的Python语法总结
| 语法 |
说明 |
open(file, mode, encoding) |
打开文件,返回文件对象。 |
file.read([size]) |
读取文件内容。 |
file.readline() |
读取一行。 |
file.readlines() |
读取所有行到列表。 |
file.write(str) |
写入字符串。 |
file.writelines(list) |
写入字符串列表。 |
file.close() |
关闭文件。 |
with open(...) as f: |
使用上下文管理器自动关闭文件。 |
file.tell() |
返回当前文件指针位置。 |
file.seek(offset, whence) |
移动文件指针。 |
try...except...finally |
异常处理结构。 |
for line in file |
直接迭代文件对象逐行读取。 |
文件模式:‘r’, ‘w’, ‘a’, ‘b’, ‘+’ |
指定打开文件的模式。 |
9. 常见错误与解决方案
| 错误现象 |
原因 |
修复方法 |
UnicodeDecodeError |
未指定编码 |
添加 encoding='utf-8' |
| 文件内容为空 |
未正确关闭文件 |
使用 with 语句 |
| 写入后内容丢失 |
未使用 ‘w’ 或 ‘a’ 模式 |
确认模式是否正确 |
| 文件路径错误 |
路径不正确(如 ./data/file.txt) |
使用绝对路径或检查当前工作目录 |
希望这份详细的Python3文件操作指南能帮助你更好地理解和使用相关功能。如果你想深入探讨更多Python技巧或遇到具体问题,欢迎来 云栈社区 的Python板块交流讨论。