文章目录

Python 文件操作:读取与写入文本文件

发布于 2026-04-05 22:50:39 · 浏览 36 次 · 评论 0 条

Python 文件操作:读取与写入文本文件

文件操作是 Python 编程中最常用的技能之一。无论是处理日志、分析数据,还是保存配置信息,都离不开对文件的读写操作。本文将详细介绍 Python 中文本文件的读取与写入方法,帮助你快速掌握这一基础而重要的技能。


一、为什么文件操作如此重要

程序运行时产生的数据默认存放在内存中,一旦程序结束,这些数据就会丢失。将数据写入文件可以实现持久化存储,即使计算机关闭,下次启动程序时仍能读取之前保存的数据。文本文件是最通用的数据交换格式,几乎所有编辑器都能识别,因此在配置管理、数据交换等场景中应用广泛。


二、读取文本文件

2.1 最基础的读取方式

读取文件的核心步骤是:打开文件、读取内容、关闭文件。下面是最基本的实现方式:

# 第一步:打开文件
file = open('example.txt', 'r', encoding='utf-8')

# 第二步:读取内容
content = file.read()
print(content)

# 第三步:关闭文件
file.close()

open() 函数接收两个必要参数:文件名和打开模式。'r' 代表只读模式,这是默认模式。如果文件不存在,程序会抛出 FileNotFoundError 错误。encoding='utf-8' 参数指定了字符编码,强烈建议始终明确指定编码,以避免不同系统间的兼容性问题。

2.2 使用 with 语句自动管理资源

手动调用 close() 存在一个潜在风险:如果读取过程中发生异常,close() 可能不会被执行,导致文件句柄泄漏。Python 提供的 with 语句可以自动处理这一问题:

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

使用 with 语句后,代码块执行完毕时,Python 会自动调用 close() 方法。即使读取过程中发生异常,文件也会被正确关闭。这是 Python 中操作文件的推荐方式。

2.3 逐行读取大文件

如果文件体积较大,一次性读取全部内容会占用大量内存。此时应该逐行读取:

with open('example.txt', 'r', encoding='utf-8') as file:
    for line in file:
        print(line.strip())  # strip() 去除行尾换行符

file 对象支持迭代协议,每次迭代返回一行内容。这种方式内存占用稳定,处理几 GB 的大文件也不会有问题。如果需要将所有行读入列表,可以使用 readlines() 方法:

with open('example.txt', 'r', encoding='utf-8') as file:
    lines = file.readlines()

for line in lines:
    print(line.strip())

三、写入文本文件

3.1 基本写入操作

写入文件同样使用 open() 函数,但需要指定不同的模式:

模式 说明
'w' 写入模式,如果文件存在则清空内容,不存在则创建新文件
'a' 追加模式,在文件末尾添加内容,不存在则创建新文件
'x' 独占创建模式,文件存在时操作失败
with open('output.txt', 'w', encoding='utf-8') as file:
    file.write('第一行内容\n')
    file.write('第二行内容\n')

write() 方法不会自动添加换行符,需要手动输入 \n。如果要写入多行,使用 writelines() 方法更高效:

lines = ['第一行内容\n', '第二行内容\n', '第三行内容\n']

with open('output.txt', 'w', encoding='utf-8') as file:
    file.writelines(lines)

3.2 追加模式的使用场景

当需要向文件末尾添加新内容而不覆盖原有数据时,使用 'a' 追加模式:

with open('log.txt', 'a', encoding='utf-8') as file:
    file.write('新的日志记录\n')

日志系统是追加模式的典型应用。每次运行程序时,新的日志信息追加到文件末尾,历史记录得以完整保留。

3.3 读写模式的注意事项

'w' 模式在打开文件时会立即清空原有内容。如果不小心用写入模式打开了重要的配置文件,原有数据将无法恢复。务必在写入前确认目标路径和模式选择,必要时先备份文件。


四、实用技巧汇总

4.1 编码问题的处理

不同操作系统默认编码不同:Windows 常用 gbk,Linux 和 macOS 常用 utf-8。跨平台应用时,明确指定 encoding='utf-8' 是最佳实践。如果遇到编码错误,可以尝试其他常见编码:

# 读取 Windows 编码的文件
with open('file.txt', 'r', encoding='gbk') as file:
    content = file.read()

4.2 文件路径的处理

文件路径建议使用原始字符串(r'path')或正斜杠('path/to/file'),避免转义字符带来的麻烦:

# 使用原始字符串
file = open(r'C:\Users\name\Documents\file.txt', 'r', encoding='utf-8')

# 使用正斜杠(跨平台兼容)
file = open('C:/Users/name/Documents/file.txt', 'r', encoding='utf-8')

4.3 检测文件是否存在

在进行文件操作前,可以先检查文件状态:

import os

if os.path.exists('example.txt'):
    print('文件存在')
else:
    print('文件不存在')

if os.path.isfile('example.txt'):
    print('这是一个文件')

五、完整示例:文件复制器

以下代码实现了一个简单的文件复制功能,展示了读写操作的综合应用:

def copy_file(source_path, destination_path):
    """复制源文件到目标路径"""
    with open(source_path, 'r', encoding='utf-8') as source:
        content = source.read()

    with open(destination_path, 'w', encoding='utf-8') as destination:
        destination.write(content)

    print(f'文件已从 {source_path} 复制到 {destination_path}')

# 使用示例
copy_file('original.txt', 'backup.txt')

这个示例演示了读取文件内容并写入新文件的完整流程。实际应用中,对于大文件应使用分块读取方式以节省内存:

def copy_large_file(source_path, destination_path):
    """逐块复制大文件"""
    chunk_size = 8192  # 每次读取 8KB

    with open(source_path, 'rb') as source:  # 二进制模式读取
        with open(destination_path, 'wb') as destination:
            while True:
                chunk = source.read(chunk_size)
                if not chunk:
                    break
                destination.write(chunk)

    print(f'文件复制完成')

二进制模式('rb''wb')适用于所有非文本文件,如图片、视频、可执行文件等,避免了编码转换带来的问题。


六、常见错误与排查

错误类型 原因 解决方案
FileNotFoundError 文件路径错误或文件不存在 检查路径拼写,确认文件位置
PermissionError 无文件读写权限 以管理员身份运行或修改文件权限
UnicodeDecodeError 编码不匹配 指定正确的 encoding 参数
io.UnsupportedOperation 模式与操作不匹配 检查 'r' 'w' 'a' 模式选择

排查文件操作问题时,首先检查三点:路径是否正确、编码是否匹配、模式是否合适。大多数错误可以通过这三项检查定位原因。


七、总结要点

  • 使用 with 语句管理文件资源,确保安全可靠
  • 始终指定 encoding='utf-8',避免编码问题
  • 大文件使用逐行读取或分块读取,避免内存溢出
  • 写入前确认模式选择,'w' 会清空文件,'a' 追加内容
  • 处理非文本文件时使用二进制模式

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文