在日常的 Python 处理文本时,读取文本文件是最常见的任务之一。本文系统对比 5 种读取文本的常用方式,从 open 的传统用法到 pathlib 的现代方案,并结合实际场景给出对比要点。
文章聚焦文本文件的读取效率、编码处理、内存使用和代码可读性等维度,帮助开发者在不同场景下选择合适的方法。
1. open() 的基础读取
1.1 最基本的单次读取
open() 是 Python 内置的文件打开入口,直接返回一个文件对象,随后可以通过 read() 方法把整个文本一次性读入内存。对于较小的文本文件,这种做法简洁高效,但需要注意内存占用。
在实际场景中,使用 encoding 参数显式指定文本编码可以避免莫名的解码问题,尤其遇到 UTF-8、GBK 等混合源时尤为重要。
# 最基本的单次读取
f = open('example.txt', 'r', encoding='utf-8')
text = f.read()
f.close()
1.2 使用 with 自动关闭资源
为了避免忘记关闭文件导致的资源泄漏,with 语句提供了上下文管理,读取完成后自动关闭文件对象,代码更健壮且可维护。
在实际工作中,with 的使用是行业的推荐实践,尤其在批处理脚本和简单工具中。
# with 自动关闭
with open('example.txt', 'r', encoding='utf-8') as f:text = f.read()
2. readlines() 与逐行遍历
2.1 readlines() 的用法及注意点
如果需要把每一行作为一个元素来处理,readlines() 可以直接返回一个字符串行的列表。对于小文件,这是一个方便的直接方法;但当文件很大时,内存占用 可能成为瓶颈。
此外,行末换行符 会被保留,需要在后续处理时考虑去除。若只对少量行进行判断,使用 列表推导 也可以节省额外的循环代码量。
# 通过 readlines 获取所有行
with open('example.txt', 'r', encoding='utf-8') as f:lines = f.readlines()
# 逐行处理示例
for line in lines:process(line.rstrip('\n'))
2.2 逐行遍历的流式读取
对于较大的文本文件,直接遍历文件对象(for line in f)是一种更省内存的模式,因为它逐行读取并处理。
这种方式的优势在于内存占用稳定,尤其在处理日志文件或实时数据时非常友好。
# 逐行遍历,逐行处理
with open('example.txt', 'r', encoding='utf-8') as f:for line in f:process(line.rstrip('\n'))
3. pathlib.Path.read_text() — 便捷读取
3.1 基本用法
借助 pathlib.Path 的 read_text(),可以在一个表达式内完成文本读取,代码更具可读性,且与路径操作无缝集成。
该方法也支持显式传入 encoding,从而避免跨平台的编码问题,适合日常脚本与文件系统工具。
from pathlib import Path
text = Path('example.txt').read_text(encoding='utf-8')
3.2 写法细节与错误处理
与传统的 open 相比,read_text() 还会在文件不存在时抛出异常,因此在生产环境中保持对 FileNotFoundError 等异常的清晰处理很重要。
对于自动化脚本,结合异常处理可以提升健壮性,避免因为单个文件缺失而中断整个流程。
from pathlib import Path
try:text = Path('example.txt').read_text(encoding='utf-8')
except FileNotFoundError:text = ''
4. pathlib.Path.open() 的灵活用法
4.1 与 open() 相同场景的替代方案
Path 对象的 open() 与内置 open() 等价,但提供了与 Path 相关的风格化操作,方便路径驱动的应用场景。
在需要对 Path 对象继续扩展其他 Pathlib 功能时,使用 Path.open() 可以保持代码的一致性和可读性。
from pathlib import Path
with Path('example.txt').open('r', encoding='utf-8') as f:data = f.read()
4.2 使用迭代器处理大文件
利用 Path.open() 的上下文管理与迭代能力,可以实现与前述 open 方式相同的流式读取,但风格统一在 Pathlib 上,便于跨平台代码维护。
在处理结构化文本时,分块读取与逐行处理的组合往往是最佳实践。
from pathlib import Path
with Path('example.txt').open('r', encoding='utf-8') as f:for line in f:process(line.rstrip('\n'))
5. 大文件与性能的实战对比
5.1 小文件 vs 大文件的选择
对于<小文件,直接使用 read_text() 或 read() 具有最小的代码量和快速开发体验;但对于大文件,推荐走流式读取或分块读取的路径,以降低峰值内存占用。
在实际工程中,确定最大允许内存和处理延迟,是选择哪种方式的关键因素之一,尤其在日志分析、数据清洗等场景中尤为重要。

# 分块读取示例,适用于大文件
def read_in_chunks(file_path, chunk_size=1024*1024):with open(file_path, 'r', encoding='utf-8') as f:while True:chunk = f.read(chunk_size)if not chunk:breakyield chunk
5.2 使用 pathlib 的对比场景
当你的项目需要大量路径拼接、跨平台路径操作时,pathlib 提供的无缝 API 和面向对象的风格能够提升可读性与健壮性,避免手写字符串拼接带来的跨平台风险。
结合具体场景,如数据管道中的配置文本、日志聚合或数据清洗脚本,Pathlib 的方法组合通常比直接使用 open 更易于维护和扩展。
# 混合使用:先定位文件,再选择读取策略
from pathlib import Path
p = Path('logs/app.log')# 大文件按行处理
with p.open('r', encoding='utf-8') as f:for line in f:process(line)# 如果要一次性获取文本
try:text = p.read_text(encoding='utf-8')
except FileNotFoundError:text = ''


