三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Python 编程 - 文件操作

Python 编程 - 文件操作

在 Python 3 中,文件操作主要通过内置的 open() 函数以及文件对象的方法来完成。下面从基础到进阶,全面介绍常用操作与最佳实践。


1. 打开文件:open()

f = open(file, mode='r', encoding=None, errors=None, newline=None, ...)

必需参数:

  • file:文件路径(字符串或 pathlib.Path 对象)。

常用模式(mode):

模式 说明
'r' 只读(默认),文件必须存在
'w' 只写,覆盖原有内容,不存在则创建
'a' 追加,写入内容追加到末尾,不存在则创建
'x' 独占创建,文件存在则报错 FileExistsError
'b' 二进制模式(如 'rb','wb')
't' 文本模式(默认,如 'rt')
'+' 更新模式(读写,如 'r+','w+','a+')

常用参数:

  • encoding:指定编码,Python 3 默认使用系统编码(如 UTF-8),但建议显式指定 encoding='utf-8'。
  • errors:编码/解码错误处理方式,如 'strict'(默认)、'ignore'、'replace'。
  • newline:控制换行符转换,取值 None、''、'\n'、'\r\n' 等。

2. 读取文件

2.1 读取全部内容

with open('data.txt', 'r', encoding='utf-8') as f:content = f.read()          # 返回字符串print(content)

2.2 按行读取

with open('data.txt', 'r', encoding='utf-8') as f:line = f.readline()          # 读一行lines = f.readlines()        # 读所有行,返回列表(每行带换行符)

2.3 迭代文件对象(最推荐,内存友好)

with open('data.txt', 'r', encoding='utf-8') as f:for line in f:               # 逐行迭代,不会一次加载全部print(line.strip())

2.4 读取指定字节数(二进制模式)

with open('data.bin', 'rb') as f:chunk = f.read(1024)         # 读取前1024字节

3. 写入文件

3.1 写入字符串(文本模式)

with open('out.txt', 'w', encoding='utf-8') as f:f.write('Hello, 世界!\n')f.write('第二行')

3.2 写入多行(可迭代对象)

lines = ['第一行\n', '第二行\n', '第三行']
with open('out.txt', 'w', encoding='utf-8') as f:f.writelines(lines)          # 不会自动添加换行,需自行包含

3.3 追加内容

with open('out.txt', 'a', encoding='utf-8') as f:f.write('追加内容')

4. 文件指针操作

  • tell():返回当前指针位置(字节数,文本模式下可能不是精确字符数)。
  • seek(offset, whence=0):移动指针。
    • whence=0:从文件开头偏移(默认)
    • whence=1:从当前位置偏移
    • whence=2:从文件末尾偏移
with open('data.txt', 'rb') as f:print(f.tell())      # 0f.seek(10)           # 跳到第10个字节data = f.read(5)

5. 自动管理资源:with 语句

使用 with 可以确保文件在代码块结束后自动关闭,即使发生异常也会正确释放资源,是推荐的标准写法。

with open('file.txt', 'r') as f:data = f.read()
# 此处文件已自动关闭

6. 异常处理

手动控制时,需要 try...finally 保证关闭:

f = open('file.txt', 'r')
try:data = f.read()
finally:f.close()

或者使用 with 更简洁。


7. 二进制文件操作

处理图片、音频、压缩包等非文本文件,使用 'rb' / 'wb' 模式,不要指定 encoding。

# 复制图片
with open('src.jpg', 'rb') as src, open('dst.jpg', 'wb') as dst:dst.write(src.read())

8. 文件对象常用属性

  • f.name:文件名
  • f.mode:打开模式
  • f.closed:是否已关闭
  • f.encoding:编码(文本模式)

9. 使用 pathlib 进行路径操作(Python 3.4+)

pathlib 提供面向对象的路径管理,可与 open() 结合:

from pathlib import Pathp = Path('data.txt')
with p.open('r', encoding='utf-8') as f:content = f.read()

10. 常见问题与最佳实践

  1. 始终指定 encoding,避免跨平台乱码。
  2. 优先使用 with,保证自动关闭。
  3. 处理大文件时,逐行或分块读取,避免 read() 一次性加载。
  4. 写入时注意换行符:Python 会按系统风格转换换行(\n -> \r\n 在 Windows),如需完全控制可用 newline=''。
  5. 文件不存在时,'r' 模式抛出 FileNotFoundError,'w' / 'a' 会自动创建。
  6. 权限问题:确保程序有相应读写权限。

11. 完整示例:读取 CSV 并处理

import csvwith open('data.csv', 'r', encoding='utf-8') as f:reader = csv.reader(f)for row in reader:print(row)

总结

操作 方法
打开 open()
读取全部 read()
读取一行 readline()
读取所有行 readlines() 或迭代
写入 write() / writelines()
关闭 close() 或 with
指针 seek() / tell()

掌握以上内容,足以应对绝大多数 Python 文件操作场景。如有特殊需求(如内存映射、临时文件等),可进一步查阅标准库 io、tempfile 等模块。

← 返回列表