Python 文件操作详解
在 Python 编程中,文件操作是日常开发中最常用的功能之一。本文将对文件的打开、关闭、读写模式、路径处理以及数据序列化等核心知识进行系统梳理。
一、文件的打开和关闭
1. open() 函数
open() 是 Python 内置函数,底层调用操作系统接口。返回的文件对象通常称为文件句柄(如 , ),所有文件操作需通过该句柄的方法完成。
Python 文件操作涵盖打开关闭、读写模式、路径管理及数据序列化。文章详解 open() 函数参数、with 上下文管理器优势、文本与二进制模式区别。介绍 read/readline/readlines 及迭代读取方法,对比 StringIO 与 BytesIO 内存操作。深入讲解 CSV 处理、sys 模块重定向以及 JSON 和 pickle 序列化反序列化的应用场景与差异。补充了 pathlib 路径库使用及异常处理最佳实践,确保代码健壮性。

在 Python 编程中,文件操作是日常开发中最常用的功能之一。本文将对文件的打开、关闭、读写模式、路径处理以及数据序列化等核心知识进行系统梳理。
open() 是 Python 内置函数,底层调用操作系统接口。返回的文件对象通常称为文件句柄(如 , ),所有文件操作需通过该句柄的方法完成。
ffh# 基本用法
f = open(r'd:\测试文件.txt', mode='r', encoding='utf-8')
content = f.read()
print(content)
f.close()
参数说明:
encoding: 指定编码格式。若不写,默认使用操作系统编码(Windows 通常为 GBK,Linux/Mac 为 UTF-8)。mode: 指定访问模式,默认为 'r'(只读)。推荐使用 with open() 语句,它能自动管理资源,无需手动调用 close(),且支持同时操作多个文件。
# 优点 1:自动关闭文件
with open('文件操作的读', encoding='utf-8') as f:
print(f.read())
# 优点 2:同时操作多个文件
with open('read.txt', encoding='utf-8') as f1, \
open('write.txt', encoding='utf-8', mode='w') as f2:
content = f1.read()
f2.write(content)
C:/Users/...。test.txt:当前文件夹。../test.txt:上一级文件夹。demo/test.txt:当前文件夹下的子目录。路径书写建议:
/(推荐),跨平台兼容性好。r'' 避免转义问题。pathlib 模块处理路径。from pathlib import Path
p = Path('data/file.txt')
if p.exists():
print(p.read_text(encoding='utf-8'))
| 模式 | 说明 |
|---|---|
r | 只读(默认),文件不存在则报错 |
w | 只写,文件不存在则创建,存在则清空 |
a | 追加写,文件不存在则创建,存在则追加内容 |
b | 二进制模式(需配合 r/w/a 使用) |
+ | 读写模式(如 r+, w+, a+) |
注意:
r) 下读取的是字符串,二进制模式 (rb) 下读取的是字节串。r+ 模式下,文件指针默认在开头。若先写后读,写入内容可能覆盖原有数据。假设文件内容为多行文本:
# read():一次性读取全部
f = open('test.txt', encoding='utf-8')
print(f.read())
f.close()
# read(n):读取 n 个字符或字节
f = open('test.txt', encoding='utf-8')
print(f.read(6)) # 读取前 6 个字符
f.close()
# readline():读取一行
f = open('test.txt', encoding='utf-8')
print(f.readline().strip())
f.close()
# readlines():读取所有行为列表(大文件慎用)
f = open('test.txt', encoding='utf-8')
lines = f.readlines()
print(lines)
f.close()
# for 循环迭代(推荐,节省内存)
with open('test.txt', encoding='utf-8') as f:
for line in f:
print(line.strip())
write():写入字符串或字节。w 模式会清空原文件内容。with open('output.txt', 'w', encoding='utf-8') as f:
f.write('Hello World\n')
tell():获取当前文件指针位置。seek(offset, whence):移动指针。
whence=0:从文件头开始。whence=1:从当前位置开始。whence=2:从文件末尾开始。with open('test.txt', 'rb') as f:
f.seek(5, 0) # 从开头跳过 5 字节
data = f.read()
实现文件拷贝时,建议使用二进制模式以兼容所有文件类型(包括图片、视频等)。
import os
def copy_file(src_path, dst_path):
if not os.path.isfile(src_path):
raise FileNotFoundError(f"源文件 {src_path} 不存在")
try:
with open(src_path, 'rb') as src, open(dst_path, 'wb') as dst:
while True:
chunk = src.read(1024 * 1024) # 每次读取 1MB
if not chunk:
break
dst.write(chunk)
print("拷贝成功")
except Exception as e:
print(f"发生错误:{e}")
CSV (Comma-Separated Values) 是以纯文本形式存储表格数据,单元格间用逗号分隔。
import csv
# 写入 CSV
with open('data.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow(['name', 'age', 'score'])
writer.writerows([
['zhangsan', 18, 98],
['lisi', 20, 99]
])
# 读取 CSV
with open('data.csv', 'r', encoding='utf-8-sig') as f:
reader = csv.reader(f)
for row in reader:
print(row)
*注:newline='' 可防止 Windows 下出现多余空行,utf-8-sig 支持 Excel 打开中文不乱码。
Python 提供 StringIO 和 BytesIO 类,将内存缓冲区当作文件对象操作。
from io import StringIO, BytesIO
# 字符串缓冲
sio = StringIO()
sio.write('hello\n')
sio.write('world')
print(sio.getvalue())
# 字节缓冲
bio = BytesIO()
bio.write('你好'.encode('utf-8'))
print(bio.getvalue())
通过修改 sys.stdin、sys.stdout、sys.stderr 可实现输入输出流的控制。
import sys
# 重定向标准输出到文件
with open('log.txt', 'w', encoding='utf-8') as f:
old_stdout = sys.stdout
sys.stdout = f
print('This goes to file')
sys.stdout = old_stdout
当需要保存复杂对象(如列表、字典、自定义类实例)时,需进行序列化。
适用于跨语言、跨平台的数据交换,仅支持基础数据类型。
import json
# 序列化
data = {'name': 'Alice', 'age': 25}
json_str = json.dumps(data, ensure_ascii=False)
# 反序列化
obj = json.loads(json_str)
# 直接读写文件
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
适用于 Python 内部数据持久化,支持任意 Python 对象,但不可跨语言。
import pickle
# 序列化并保存
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
# 加载
with open('data.pkl', 'rb') as f:
loaded_data = pickle.load(f)
try-except-finally 或 with 语句确保资源释放。UTF-8 编码,避免在不同操作系统间传输时出现乱码。readlines() 读取超大文件,应采用迭代器逐行处理。通过以上方法,可以高效、安全地处理 Python 中的各类文件操作需求。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online