在Python开发中,读取本地文件是处理数据、加载配置、解析日志等场景下的基础操作,掌握不同的文件读取方法能够适配不同的业务需求,提升代码的稳定性和可读性。

基础文件读取方法
Python内置的open()函数是读取本地文件的核心入口,通过指定文件路径和打开模式,就可以获取文件对象,进而调用对应的读取方法。
最基础的读取流程是先调用open()打开文件,再调用文件对象的read()方法读取全部内容,最后手动关闭文件释放资源,示例代码如下:
# 打开当前目录下的test.txt文件,模式为只读文本
file_obj = open('test.txt', 'r', encoding='utf-8')
# 读取文件全部内容
content = file_obj.read()
# 打印读取到的内容
print(content)
# 手动关闭文件,释放系统资源
file_obj.close()
这里的打开模式r表示只读文本模式,encoding参数指定文件的编码格式,避免中文内容出现乱码。如果不指定编码,Python会使用系统默认编码,在跨环境运行时容易出现问题。
使用with语句的安全读取方式
上面的基础方法需要手动调用close()关闭文件,如果读取过程中出现异常,可能导致文件无法正确关闭,造成资源泄露。使用with语句可以自动管理文件的生命周期,无论是否出现异常,都会在代码块执行结束后自动关闭文件。
使用with语句读取文件的示例代码如下:
# 使用with语句打开文件,无需手动关闭
with open('test.txt', 'r', encoding='utf-8') as file_obj:
content = file_obj.read()
print(content)
这种方式是实际开发中最推荐的文件读取方式,代码更简洁,也能避免资源泄露问题。
不同读取方法的适用场景
文件对象除了read()方法外,还提供了其他读取方法,适配不同的读取需求:
- read(size):指定读取的字节数或字符数,适合大文件分段读取,避免一次性加载全部内容占用过多内存。示例:
part_content = file_obj.read(1024)表示每次读取1024个字符。 - readline():每次读取一行内容,适合按行处理的文本文件,比如日志文件逐行解析。示例:
line = file_obj.readline()读取当前行内容。 - readlines():读取文件所有行,返回一个包含每行内容的列表,适合需要逐行遍历且文件不大的场景。示例:
lines = file_obj.readlines()获取所有行列表。
读取二进制文件的方法
如果需要读取图片、视频、压缩包等非文本文件,需要使用二进制读取模式,将打开模式的r替换为rb,此时不需要指定encoding参数,读取到的是字节流数据。
读取二进制文件的示例代码如下:
# 读取图片文件,模式为只读二进制
with open('test.jpg', 'rb') as file_obj:
binary_data = file_obj.read()
print(f'读取到的字节数:{len(binary_data)}')
常见问题与解决方法
在读取本地文件时,经常会遇到两个问题:
文件不存在报错
如果指定的文件路径不存在,open()函数会抛出FileNotFoundError异常,可以通过try-except语句捕获处理:
try:
with open('not_exist.txt', 'r', encoding='utf-8') as file_obj:
content = file_obj.read()
print(content)
except FileNotFoundError:
print('指定的文件不存在,请检查文件路径是否正确')
编码错误
如果文件的编码格式和指定的encoding参数不匹配,会抛出UnicodeDecodeError异常,此时可以尝试更换编码格式,比如常见的gbk、utf-16等,或者添加errors参数忽略错误:
# 忽略编码错误,遇到无法解码的字符直接跳过
with open('test.txt', 'r', encoding='utf-8', errors='ignore') as file_obj:
content = file_obj.read()
print(content)
| 打开模式 | 含义 | 适用场景 |
|---|---|---|
| r | 只读文本模式 | 读取文本文件,如txt、csv、代码文件等 |
| rb | 只读二进制模式 | 读取图片、视频、压缩包等非文本文件 |
| r+ | 读写文本模式 | 需要同时读取和修改文本文件的场景 |
| rb+ | 读写二进制模式 | 需要同时读取和修改二进制文件的场景 |