文章目录
- Python 文件操作详解
- 一、文件操作的基本流程
- 二、文件打开模式详解
- 1. 基本模式
- 2. 扩展模式
- 3. 模式组合示例
- 三、文件操作方法大全
- 1. 打开和关闭文件
- 2. 读取文件内容
- 3. 写入文件内容
- 4. 文件指针操作
- 四、文件编码处理
- 五、二进制文件操作
- 六、常见文件操作场景
- 1. 文件内容修改
- 2. CSV文件处理
- 3. JSON文件处理
- 七、文件操作最佳实践
Python 文件操作详解
文件操作是编程中最基础也是最重要的功能之一。Python 提供了丰富的文件操作方法,下面我将从基础到高级,全面详细地讲解 Python 中的文件操作。
一、文件操作的基本流程
文件操作的三个核心步骤:
- 打开文件:建立程序与文件的连接
- 读写操作:读取内容或写入数据
- 关闭文件:释放系统资源
[打开文件 open()] → [读/写 read()/write()] → [关闭文件 close()]
二、文件打开模式详解
Python 的 open()
函数支持多种模式,可以通过组合使用实现不同功能:
1. 基本模式
模式 | 描述 | 文件指针位置 | 文件存在 | 文件不存在 |
---|---|---|---|---|
‘r’ | 只读 | 文件开头 | 正常打开 | 报错 FileNotFoundError |
‘w’ | 写入 | 文件开头 | 清空内容 | 创建新文件 |
‘a’ | 追加 | 文件末尾 | 保留内容 | 创建新文件 |
‘x’ | 创建 | 文件开头 | 报错 FileExistsError | 创建新文件 |
2. 扩展模式
模式 | 描述 | 常组合的模式 |
---|---|---|
‘b’ | 二进制模式 | ‘rb’, ‘wb’, ‘ab’ |
‘t’ | 文本模式(默认) | ‘rt’, ‘wt’, ‘at’ |
‘+’ | 读写模式 | ‘r+’, ‘w+’, ‘a+’ |
3. 模式组合示例
# 文本模式读写(默认)
f = open('file.txt', 'r') # 等同于 'rt'# 二进制模式读写
f = open('image.png', 'rb')# 读写模式(可读可写)
f = open('data.txt', 'r+') # 读写,文件必须存在
f = open('data.txt', 'w+') # 读写,会清空文件
f = open('data.txt', 'a+') # 读写,追加模式
三、文件操作方法大全
1. 打开和关闭文件
# 基本打开方式
f = open('example.txt', 'r')
try:# 文件操作content = f.read()
finally:f.close() # 必须确保文件被关闭# 推荐使用 with 语句(上下文管理器)
with open('example.txt', 'r') as f:content = f.read()
# 离开 with 块后文件自动关闭
2. 读取文件内容
方法 | 描述 | 适用场景 |
---|---|---|
read(size) | 读取size字节/字符,不指定则读取全部 | 小文件读取 |
readline() | 读取一行 | 逐行处理 |
readlines() | 读取所有行,返回列表 | 需要所有行时 |
迭代文件对象 | 逐行读取 | 大文件处理 |
# 读取整个文件
with open('example.txt', 'r') as f:content = f.read() # 全部内容作为一个字符串# 逐行读取(内存友好)
with open('large_file.txt', 'r') as f:for line in f: # 文件对象是可迭代的print(line.strip()) # 去除首尾空白字符# 读取特定字节数
with open('binary.data', 'rb') as f:chunk = f.read(1024) # 读取1024字节while chunk: # 循环读取直到文件结束process(chunk)chunk = f.read(1024)
3. 写入文件内容
方法 | 描述 | 注意点 |
---|---|---|
write(str) | 写入字符串 | 不会自动加换行 |
writelines(seq) | 写入字符串序列 | 序列中的字符串不会被自动处理 |
# 写入字符串
with open('output.txt', 'w') as f:f.write("Hello, World!\n") # 需要手动添加换行符f.write("这是第二行内容\n")# 写入多行
lines = ["第一行\n", "第二行\n", "第三行\n"]
with open('lines.txt', 'w') as f:f.writelines(lines) # 注意:不会自动添加换行符# 追加内容
with open('log.txt', 'a') as f:f.write("新的日志条目\n")
4. 文件指针操作
文件对象维护一个指针,指示当前读写位置:
方法 | 描述 |
---|---|
tell() | 返回当前指针位置 |
seek(offset, whence) | 移动指针到指定位置 |
whence
参数:
- 0: 文件开头(默认)
- 1: 当前位置
- 2: 文件末尾
with open('example.txt', 'rb+') as f: # 必须用二进制模式才能使用非0的whenceprint(f.tell()) # 0,文件开头f.seek(5) # 移动到第5字节print(f.tell()) # 5f.seek(3, 1) # 从当前位置再移动3字节print(f.tell()) # 8f.seek(-2, 2) # 移动到文件末尾前2字节print(f.tell()) # 文件总长度-2
四、文件编码处理
文本文件需要指定正确的编码,常见编码:
- UTF-8(推荐)
- GBK(中文Windows常用)
- ASCII(仅基础英文)
# 读取不同编码的文件
with open('gbk_file.txt', 'r', encoding='gbk') as f:content = f.read()# 写入指定编码的文件
with open('utf8_file.txt', 'w', encoding='utf-8') as f:f.write("这是UTF-8编码的内容")# 处理编码错误(遇到无法解码的字符时)
with open('problematic.txt', 'r', encoding='utf-8', errors='ignore') as f:content = f.read() # 忽略无法解码的字符
# 其他errors参数:'replace'(用?替代), 'strict'(默认,抛出异常)
五、二进制文件操作
处理图片、音频、视频等非文本文件:
# 复制二进制文件
with open('source.jpg', 'rb') as src, open('copy.jpg', 'wb') as dst:dst.write(src.read())# 分块读取大文件
CHUNK_SIZE = 1024 * 1024 # 1MB
with open('large_video.mp4', 'rb') as f:while True:chunk = f.read(CHUNK_SIZE)if not chunk: # 读取结束breakprocess_chunk(chunk)
六、常见文件操作场景
1. 文件内容修改
# 修改文件中的特定内容
with open('config.ini', 'r+') as f:lines = f.readlines()f.seek(0) # 回到文件开头for line in lines:if line.startswith('timeout='):f.write('timeout=300\n') # 修改配置else:f.write(line)f.truncate() # 截断文件,确保删除旧内容
2. CSV文件处理
import csv# 读取CSV文件
with open('data.csv', 'r', newline='') as f:reader = csv.reader(f)for row in reader:print(row)# 写入CSV文件
data = [['Name', 'Age'], ['Alice', 25], ['Bob', 30]]
with open('output.csv', 'w', newline='') as f:writer = csv.writer(f)writer.writerows(data)
3. JSON文件处理
import json# 读取JSON文件
with open('data.json', 'r') as f:data = json.load(f)print(data['key'])# 写入JSON文件
data = {'name': 'Alice', 'age': 25, 'skills': ['Python', 'Java']}
with open('output.json', 'w') as f:json.dump(data, f, indent=4) # indent参数美化输出
七、文件操作最佳实践
- 总是使用 with 语句:确保文件正确关闭,即使发生异常
- 处理大文件要分块:避免内存不足,使用迭代或分块读取
- 明确指定编码:特别是跨平台应用,默认使用UTF-8
- 检查文件存在性:操作前检查
os.path.exists()
或捕获异常 - 注意换行符差异:Windows(
\r\n
), Linux/macOS(\n
), 使用newline=''
控制 - 二进制模式处理行尾:二进制模式下不会转换行尾符
# 综合最佳实践示例
import os
from pathlib import Pathfile_path = Path('data') / 'important.txt'try:with open(file_path, 'r+', encoding='utf-8', newline='') as f:# 读取内容content = f.read()# 处理内容modified = content.replace('old', 'new')# 写回文件f.seek(0)f.write(modified)f.truncate() # 确保删除旧内容except FileNotFoundError:print(f"错误:文件 {file_path} 不存在")
except PermissionError:print(f"错误:没有权限访问 {file_path}")
except UnicodeDecodeError:print(f"错误:文件编码问题,尝试其他编码")
通过以上详细讲解,你应该对Python文件操作有了全面的了解。记住,文件操作是编程基础,熟练掌握这些方法对日常开发非常有帮助!