Python文件读写操作详解

夏知夏
夏知夏
发布时间:2026-10-10| 3人浏览过
原创

本文详细解析Python文件读写的核心流程,从open()函数的常用模式切入,重点讲解利用with语句实现自动资源回收的安全语法。涵盖read系列读取API、write方法写入技巧及二进制操作注意事项,最后通过日志管理脚本演示完整的工程化应用,助力开发者高效处理文本与数据文件。

一、 掌握文件打开与模式选择

Python 中进行文件交互的基础是 open() 函数。调用该函数会返回一个文件对象,后续所有操作均基于此对象展开。其核心参数如下:

  • file:文件路径(支持相对路径或绝对路径)。
  • mode:打开模式,决定数据的流向与权限。
open(file, mode)

常用操作模式对照表

模式组合功能说明
r只读(默认)。文件不存在则抛出FileNotFoundError。
w覆盖写。存在则清空内容,不存在则新建。⚠️覆盖模式会直接删除原有数据,写入前请务必确认或备份。
a追加写。在文件末尾写入新内容,不存在则创建。
x独占创建。若目标已存在,抛出FileExistsError,用于防止重复初始化。
b二进制模式。用于图片、音频或非结构化数据流处理。
t文本模式(默认)。默认按字符流处理,建议显式声明encoding参数。
r+ / w+ / a+同时具备读写或追加能力。其中w+同样会清空原文件。

二、 使用 with 语句安全释放资源

传统操作中需手动调用 file.close() 释放系统句柄。若中途发生异常导致代码中断,文件将处于未关闭状态并可能引发内存占用或锁死。推荐使用上下文管理器 with 语句:

# 标准语法结构
with open('文件路径', '操作模式', encoding='utf-8') as 变量名:
    # 在此缩进块内执行读写操作
    pass

一旦退出 with 代码块,Python 会自动触发清理动作。无论块内是否抛出异常,均能保证底层文件描述符被正确回收,代码更简洁且健壮。

三、 精准读取文件内容

根据业务场景,可选择不同粒度的读取方式。假设测试文件 example.txt 包含5行文本:

# 预置测试数据
hello world
hello world
hello world
hello world
hello world

1. read() 全文读取

一次性加载全部内容至内存,返回完整字符串。适用于体积较小的配置文件或短文本。

with open('example.txt', 'r', encoding='utf-8') as f:
    content = f.read()
    print(content)

2. readline() 逐行读取

每次调用仅获取当前指针位置的一行数据(末尾含 \n),适合需要逐行校验或延迟加载的场景。

with open('example.txt', 'r', encoding='utf-8') as f:
    line_1 = f.readline()
    print(line_1.strip())  # 清除首尾空白后输出第一行

3. readlines() 列表读取

读取全量数据并按换行符切分,返回包含各行字符串的列表。每行末尾默认保留回车符。

with open('example.txt', 'r', encoding='utf-8') as f:
    lines_list = f.readlines()
    print(lines_list)  # 输出: ['hello world\n', ...]

四、 灵活写入与追加数据

1. 文本写入与覆盖控制

write() 接收单个字符串。若需多行输出,必须显式传入换行符 \n,否则内容将粘连在同一行。

# 覆盖写入示例
with open('output.txt', 'w', encoding='utf-8') as f:
    f.write('Hello, Python!\nThis is line two.')

# 追加写入示例
with open('output.txt', 'a', encoding='utf-8') as f:
    f.write('\nAppended new content safely.')

2. 批量写入 writelines()

接收字符串迭代对象(如列表),不自动添加换行符,需手动维护分隔符以避免格式混乱。

data_block = ['Row A\n', 'Row B\n']
with open('batch_out.txt', 'w', encoding='utf-8') as f:
    f.writelines(data_block)

3. 二进制操作 (wb / ab)

处理 .jpg、.mp3 或网络协议数据流时需切换至二进制模式。此时传入的数据类型必须为 bytes,传入普通字符串会触发 TypeError。

binary_data = b'\xFF\xD8\xFF\xE0'  # 模拟JPEG文件头字节
with open('header.jpg', 'wb') as f:
    f.write(binary_data)

五、 完整案例:轻量级日志管理器

在实际工程中,常需将运行轨迹持久化。以下代码封装了标准的日志读写逻辑,兼顾安全性、可读性与复用性。

import os

def append_log(msg: str):
    """追加单条日志到 logfile.txt"""
    path = 'logfile.txt'
    with open(path, 'a', encoding='utf-8') as lf:
        timestamp = os.popen('date +"%Y-%m-%d %H:%M:%S"').read().strip()
        lf.write(f"[{timestamp}] {msg}\n")

def fetch_logs():
    """读取全部历史日志并返回列表"""
    if not os.path.exists('logfile.txt'):
        return []
    with open('logfile.txt', 'r', encoding='utf-8') as lf:
        return lf.readlines()

# 模拟业务流转记录
append_log('用户登录成功')
append_log('数据库查询超时')

# 检索并打印脱敏日志
print(fetch_logs())

六、 操作总结与排错建议

  • 权限与占用检查:若控制台抛出 PermissionError,通常因文件正被 Excel、IDE 或杀毒软件锁定。关闭关联进程后重试即可恢复写入。
  • 编码匹配原则:现代项目统一使用 utf-8。读取老旧系统导出的报表时若出现乱码,请尝试切换 gbk 或 latin-1 解码器。
  • 大数据流式处理:处理数 GB 的日志或 CSV 时严禁使用 read(),应采用 for line in f: 迭代器逐行扫描,防止 OOM(内存溢出)崩溃。

以上就是Python文件读写操作详解的详细内容,更多关于Python文件读写操作的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。