Python 文件读写详解

在日常开发中,文件读写是最常见的基础操作之一。无论是处理配置文件、日志,还是数据导入导出,都离不开它。

参考文章:Python 文件读写 | 简单一点学习 easyeasy.me

1. 基础文件操作

Python 提供了一个内置函数 open() 用来打开文件,返回一个文件对象。

python 复制代码
# 打开文件
f = open("example.txt", "r")  # 以只读模式打开

# 读取内容
content = f.read()
print(content)

# 关闭文件
f.close()

基本步骤就是:打开 → 操作 → 关闭

不过,推荐用 with 语句,这样会自动关闭文件,更安全:

python 复制代码
with open("example.txt", "r") as f:
    content = f.read()
    print(content)
# 这里文件已经自动关闭

2. 文件操作模式

open() 的第二个参数决定了文件的打开模式,常用模式如下:

模式 含义
'r' 只读(文件必须存在)
'w' 写入(会清空原文件,没有则创建)
'a' 追加(写在文件末尾,没有则创建)
'rb' 以二进制模式读取
'wb' 以二进制模式写入
'ab' 以二进制模式追加
'r+' 读写(文件必须存在)
'w+' 写读(会清空原文件)
'a+' 追加读写

示例:

python 复制代码
# 写入文件
with open("example.txt", "w") as f:
    f.write("Hello Python\n")

# 追加文件
with open("example.txt", "a") as f:
    f.write("Another line\n")

3. 读取文件内容的多种方式

Python 提供了多种读取方式,可以根据文件大小和需求选择:

python 复制代码
# 1. 读取全部
with open("example.txt", "r") as f:
    data = f.read()
    print(data)

# 2. 按行读取到列表
with open("example.txt", "r") as f:
    lines = f.readlines()
    print(lines)

# 3. 一行一行读取(适合大文件)
with open("example.txt", "r") as f:
    for line in f:
        print(line.strip())

# 4. 指定字节数读取
with open("example.txt", "r") as f:
    chunk = f.read(5)  # 读取前5个字符
    print(chunk)

4. 字符编码问题

默认情况下,open() 使用系统默认编码(Windows 上是 gbk,Linux/Mac 是 utf-8)。

为了避免乱码,建议显式指定编码

python 复制代码
# 推荐做法
with open("example.txt", "r", encoding="utf-8") as f:
    print(f.read())

常见编码:

  • utf-8(推荐)
  • gbk(Windows 常见)
  • ascii(纯英文文件)

如果读取时编码错误,可以这样处理:

python 复制代码
with open("example.txt", "r", encoding="utf-8", errors="ignore") as f:
    print(f.read())

5. 二进制文件操作

处理图片、音频、视频等非文本文件时,需要用二进制模式

python 复制代码
# 读取图片
with open("image.png", "rb") as f:
    data = f.read()
    print(len(data))

# 写入二进制文件
with open("copy.png", "wb") as f:
    f.write(data)

6. 处理大文件

如果文件很大,直接 read() 会占用大量内存,这时建议分块读取。

python 复制代码
# 按固定大小读取
with open("bigfile.txt", "r", encoding="utf-8") as f:
    while True:
        chunk = f.read(1024)  # 每次读 1KB
        if not chunk:
            break
        print(chunk, end="")

或者用生成器:

python 复制代码
def read_in_chunks(file, size=1024):
    while True:
        data = file.read(size)
        if not data:
            break
        yield data

with open("bigfile.txt", "r", encoding="utf-8") as f:
    for part in read_in_chunks(f):
        print(part)

7. 文件路径与跨平台兼容性

直接写路径容易出错,建议用 ospathlib 来拼接路径。

python 复制代码
import os

# 自动拼接路径(跨平台)
file_path = os.path.join("data", "example.txt")

# 确保文件夹存在
os.makedirs("data", exist_ok=True)

with open(file_path, "w", encoding="utf-8") as f:
    f.write("Hello World")

使用 pathlib 更优雅:

python 复制代码
from pathlib import Path

p = Path("data") / "example.txt"
p.parent.mkdir(parents=True, exist_ok=True)
p.write_text("Hello Pathlib", encoding="utf-8")
print(p.read_text(encoding="utf-8"))

8. 异常处理

读写文件时可能出现各种错误,比如文件不存在权限不足编码错误 等。

建议用 try-except 捕获异常。

python 复制代码
try:
    with open("nofile.txt", "r", encoding="utf-8") as f:
        print(f.read())
except FileNotFoundError:
    print("文件不存在")
except PermissionError:
    print("没有权限")
except Exception as e:
    print("发生错误:", e)

9. 最佳实践

  1. 总是使用 with 语句,确保文件能正常关闭。
  2. 显式指定编码,尤其是跨平台环境下。
  3. 处理大文件时分块读取,避免一次性占用太多内存。
  4. 路径操作用 os.pathpathlib,避免硬编码分隔符。
  5. 捕获异常,让程序更稳健。
  6. 写文件时确认数据安全,必要时先写到临时文件再替换。
相关推荐
考虑考虑40 分钟前
docker compose V2版本新属性
运维·后端·自动化运维
qq5918406851 小时前
uiautomator2自动化安卓手机操作
python
80s7772 小时前
动态代理和静态代理的区别,动态代理怎么提高网络安全性
python
GreenTea3 小时前
7000 万 QPS、500 PB:OpenAI 如何用一个 Python 存储平台撑住 10 亿用户
后端·架构
Flynt3 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet3 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
GreenTea3 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
niucloud-admin4 小时前
JAVA V6 多商户商城 开发文档——job 计划任务开发
java·python·github
小叶肥辉4 小时前
LangChain链和LangGraph图的学习笔记【三】——分别用langchain_openai库和langchain_community库调用大模型
笔记·python·langchain
2401_873479404 小时前
IP属地为什么有时显示外省?用IP查询工具核查动态分配、运营商出口与GeoIP库
python·tcp/ip·ip