Python 文件操作:读取与写入文本文件
文件操作是 Python 编程中最常用的技能之一。无论是处理日志、分析数据,还是保存配置信息,都离不开对文件的读写操作。本文将详细介绍 Python 中文本文件的读取与写入方法,帮助你快速掌握这一基础而重要的技能。
一、为什么文件操作如此重要
程序运行时产生的数据默认存放在内存中,一旦程序结束,这些数据就会丢失。将数据写入文件可以实现持久化存储,即使计算机关闭,下次启动程序时仍能读取之前保存的数据。文本文件是最通用的数据交换格式,几乎所有编辑器都能识别,因此在配置管理、数据交换等场景中应用广泛。
二、读取文本文件
2.1 最基础的读取方式
读取文件的核心步骤是:打开文件、读取内容、关闭文件。下面是最基本的实现方式:
# 第一步:打开文件
file = open('example.txt', 'r', encoding='utf-8')
# 第二步:读取内容
content = file.read()
print(content)
# 第三步:关闭文件
file.close()
open() 函数接收两个必要参数:文件名和打开模式。'r' 代表只读模式,这是默认模式。如果文件不存在,程序会抛出 FileNotFoundError 错误。encoding='utf-8' 参数指定了字符编码,强烈建议始终明确指定编码,以避免不同系统间的兼容性问题。
2.2 使用 with 语句自动管理资源
手动调用 close() 存在一个潜在风险:如果读取过程中发生异常,close() 可能不会被执行,导致文件句柄泄漏。Python 提供的 with 语句可以自动处理这一问题:
with open('example.txt', 'r', encoding='utf-8') as file:
content = file.read()
print(content)
使用 with 语句后,代码块执行完毕时,Python 会自动调用 close() 方法。即使读取过程中发生异常,文件也会被正确关闭。这是 Python 中操作文件的推荐方式。
2.3 逐行读取大文件
如果文件体积较大,一次性读取全部内容会占用大量内存。此时应该逐行读取:
with open('example.txt', 'r', encoding='utf-8') as file:
for line in file:
print(line.strip()) # strip() 去除行尾换行符
file 对象支持迭代协议,每次迭代返回一行内容。这种方式内存占用稳定,处理几 GB 的大文件也不会有问题。如果需要将所有行读入列表,可以使用 readlines() 方法:
with open('example.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
for line in lines:
print(line.strip())
三、写入文本文件
3.1 基本写入操作
写入文件同样使用 open() 函数,但需要指定不同的模式:
| 模式 | 说明 |
|---|---|
'w' |
写入模式,如果文件存在则清空内容,不存在则创建新文件 |
'a' |
追加模式,在文件末尾添加内容,不存在则创建新文件 |
'x' |
独占创建模式,文件存在时操作失败 |
with open('output.txt', 'w', encoding='utf-8') as file:
file.write('第一行内容\n')
file.write('第二行内容\n')
write() 方法不会自动添加换行符,需要手动输入 \n。如果要写入多行,使用 writelines() 方法更高效:
lines = ['第一行内容\n', '第二行内容\n', '第三行内容\n']
with open('output.txt', 'w', encoding='utf-8') as file:
file.writelines(lines)
3.2 追加模式的使用场景
当需要向文件末尾添加新内容而不覆盖原有数据时,使用 'a' 追加模式:
with open('log.txt', 'a', encoding='utf-8') as file:
file.write('新的日志记录\n')
日志系统是追加模式的典型应用。每次运行程序时,新的日志信息追加到文件末尾,历史记录得以完整保留。
3.3 读写模式的注意事项
'w' 模式在打开文件时会立即清空原有内容。如果不小心用写入模式打开了重要的配置文件,原有数据将无法恢复。务必在写入前确认目标路径和模式选择,必要时先备份文件。
四、实用技巧汇总
4.1 编码问题的处理
不同操作系统默认编码不同:Windows 常用 gbk,Linux 和 macOS 常用 utf-8。跨平台应用时,明确指定 encoding='utf-8' 是最佳实践。如果遇到编码错误,可以尝试其他常见编码:
# 读取 Windows 编码的文件
with open('file.txt', 'r', encoding='gbk') as file:
content = file.read()
4.2 文件路径的处理
文件路径建议使用原始字符串(r'path')或正斜杠('path/to/file'),避免转义字符带来的麻烦:
# 使用原始字符串
file = open(r'C:\Users\name\Documents\file.txt', 'r', encoding='utf-8')
# 使用正斜杠(跨平台兼容)
file = open('C:/Users/name/Documents/file.txt', 'r', encoding='utf-8')
4.3 检测文件是否存在
在进行文件操作前,可以先检查文件状态:
import os
if os.path.exists('example.txt'):
print('文件存在')
else:
print('文件不存在')
if os.path.isfile('example.txt'):
print('这是一个文件')
五、完整示例:文件复制器
以下代码实现了一个简单的文件复制功能,展示了读写操作的综合应用:
def copy_file(source_path, destination_path):
"""复制源文件到目标路径"""
with open(source_path, 'r', encoding='utf-8') as source:
content = source.read()
with open(destination_path, 'w', encoding='utf-8') as destination:
destination.write(content)
print(f'文件已从 {source_path} 复制到 {destination_path}')
# 使用示例
copy_file('original.txt', 'backup.txt')
这个示例演示了读取文件内容并写入新文件的完整流程。实际应用中,对于大文件应使用分块读取方式以节省内存:
def copy_large_file(source_path, destination_path):
"""逐块复制大文件"""
chunk_size = 8192 # 每次读取 8KB
with open(source_path, 'rb') as source: # 二进制模式读取
with open(destination_path, 'wb') as destination:
while True:
chunk = source.read(chunk_size)
if not chunk:
break
destination.write(chunk)
print(f'文件复制完成')
二进制模式('rb' 和 'wb')适用于所有非文本文件,如图片、视频、可执行文件等,避免了编码转换带来的问题。
六、常见错误与排查
| 错误类型 | 原因 | 解决方案 |
|---|---|---|
FileNotFoundError |
文件路径错误或文件不存在 | 检查路径拼写,确认文件位置 |
PermissionError |
无文件读写权限 | 以管理员身份运行或修改文件权限 |
UnicodeDecodeError |
编码不匹配 | 指定正确的 encoding 参数 |
io.UnsupportedOperation |
模式与操作不匹配 | 检查 'r' 'w' 'a' 模式选择 |
排查文件操作问题时,首先检查三点:路径是否正确、编码是否匹配、模式是否合适。大多数错误可以通过这三项检查定位原因。
七、总结要点
- 使用
with语句管理文件资源,确保安全可靠 - 始终指定
encoding='utf-8',避免编码问题 - 大文件使用逐行读取或分块读取,避免内存溢出
- 写入前确认模式选择,
'w'会清空文件,'a'追加内容 - 处理非文本文件时使用二进制模式

暂无评论,快来抢沙发吧!