python中的文件操作

Python 文件操作完全指南

Python 通过内置的 open() 函数和文件对象提供丰富的文件操作能力。下面系统介绍常用操作。

1. 打开文件:open()

python 复制代码
f = open('test.txt', 'r')      # 模式 'r' 表示只读

常用模式

模式 说明 文件指针位置
'r' 只读(默认) 文件开头
'w' 写入(会覆盖或创建文件) 文件开头(清空原内容)
'x' 独占创建,文件已存在则报错 文件开头
'a' 追加(文件末尾添加) 文件末尾
'b' 二进制模式(与 r/w/a 组合,如 'rb' 取决于组合
't' 文本模式(默认) 取决于组合
'+' 读写模式(如 'r+''w+' 取决于前缀

示例

python 复制代码
f = open('data.bin', 'wb')      # 二进制写入
f = open('log.txt', 'a')        # 追加文本
f = open('file.txt', 'r+')      # 读写

2. 推荐方式:使用 with 上下文管理器

with 自动关闭文件,即使发生异常也能正确释放资源。

python 复制代码
with open('test.txt', 'r') as f:
    content = f.read()
# 离开 with 块后,f 已被自动关闭

3. 读取文件

方法 说明
read(size=-1) 读取最多 size 个字符(文本模式)或字节(二进制模式),默认全部
readline() 读取一行(包括换行符),文件末尾返回空字符串
readlines() 读取所有行,返回字符串列表
直接迭代文件对象 for line in f: 逐行读取,内存高效
python 复制代码
with open('test.txt') as f:
    data = f.read()          # 一次性读取全部

with open('test.txt') as f:
    for line in f:           # 逐行迭代,适合大文件
        print(line.strip())

4. 写入文件

方法 说明
write(s) 写入字符串 s,返回写入的字符数
writelines(lines) 写入字符串列表(不会自动添加换行符)
python 复制代码
with open('output.txt', 'w') as f:
    f.write("Hello\n")
    f.writelines(["line1\n", "line2\n"])

注意'w' 模式会清空原文件;如需追加,使用 'a' 模式。

5. 文件指针操作

方法 说明
tell() 返回当前文件指针位置(字节数,二进制模式;文本模式下可能不准确,取决于编码)
seek(offset, whence=0) 移动指针:whence=0 文件开头偏移;1 当前位置;2 文件末尾
python 复制代码
with open('data.bin', 'rb') as f:
    print(f.tell())      # 0
    f.seek(10)           # 跳到第10字节
    data = f.read(5)     # 读取5字节

6. 其他常用属性和方法

  • f.closed:文件是否已关闭。
  • f.name:文件名。
  • f.mode:打开模式。
  • f.flush():将缓冲区内容强制写入磁盘。
  • f.close():关闭文件(通常用 with 避免手动调用)。

7. 二进制文件操作

读取图片、音频等需用二进制模式 'rb''wb'

python 复制代码
with open('image.jpg', 'rb') as f:
    img_data = f.read()

with open('copy.jpg', 'wb') as f:
    f.write(img_data)

8. 常见编码处理

文本模式默认使用平台编码(如 Windows 的 GBK),建议显式指定 encoding

python 复制代码
with open('utf8.txt', 'r', encoding='utf-8') as f:
    content = f.read()

9. 异常处理

python 复制代码
try:
    with open('not_exist.txt') as f:
        data = f.read()
except FileNotFoundError:
    print("文件不存在")
except PermissionError:
    print("权限不足")

10. 实用示例

逐行处理大文件

python 复制代码
with open('large.log') as f:
    for line in f:
        if 'ERROR' in line:
            print(line)

复制文件

python 复制代码
with open('src.bin', 'rb') as src, open('dst.bin', 'wb') as dst:
    dst.write(src.read())

统计行数

python 复制代码
with open('file.txt') as f:
    line_count = sum(1 for _ in f)

总结

  • open() 打开文件,务必使用 with 确保正确关闭。
  • 根据需求选择合适的模式(文本/二进制、读/写/追加)。
  • 大文件应逐行迭代,避免一次性 read() 导致内存溢出。
  • 处理文本文件时明确指定 encoding 参数。 更高级的操作(如临时文件、文件锁、内存映射),如 tempfilefcntlmmap 等模块。
相关推荐
m0_694845572 小时前
VoxCPM部署教程:构建AI语音交互系统
服务器·人工智能·后端·自动化
Rust研习社2 小时前
Rust 是如何判断对象是否相等的?一起来聊一聊 PartialEq 与 Eq
后端·rust·编程语言
我叫黑大帅2 小时前
TCP 长连接服务:登录注册认证体系实战指南
后端·面试·go
我叫黑大帅2 小时前
TCP通信 - 处理 TCP 流中的消息分片
后端·面试·go
卜夋2 小时前
Rust 所有权概念
后端·rust
希望永不加班2 小时前
SpringBoot 依赖管理:BOM 与版本控制
java·spring boot·后端·spring
群书聊架构2 小时前
基于共享内存的高性能 Linux IPC 设计实践(上):从原理到无锁环形缓冲区
后端
落木萧萧8252 小时前
MyBatis、MyBatis-Plus、JPA、MyBatisGX 写法比较:同一个需求,四种解法
java·后端
PFinal社区_南丞2 小时前
为什么我用 Go 写 AI Agent 而不是 Python
后端·go