Python无法完整读取3GB文本文件及UnicodeDecodeError问题求助
解决大文件读取的编码错误与完整读取问题
我来帮你分析下问题所在,以及对应的解决办法:
问题原因
- 编码解码错误:你指定的
cp1252编码里没有对应字节0x8d的字符,Python尝试解码这个字节时直接抛出UnicodeDecodeError,中断了文件读取——这就是你无法完整读取文件的直接原因。 - 大文件处理的健壮性不足:虽然
for line in f是逐行读取(不会一次性把3GB文件加载到内存),但一旦遇到编码错误就会停止执行;另外手动调用close()也有风险,如果程序中途崩溃,文件可能无法正常关闭。
解决建议
1. 处理编码错误
你可以通过两种方式解决编码问题:
- 临时绕过错误:打开文件时指定
errors参数,让Python遇到无法解码的字节时忽略或替换,而非直接崩溃。常用参数值:errors='ignore':直接跳过无法解码的字节errors='replace':用�替换无法解码的字节
- 确认正确编码:如果知道文件的实际编码(比如
utf-8、gbk等),替换cp1252为正确编码即可彻底解决问题。
2. 优化大文件处理的健壮性
- 使用
with语句管理文件,它会在代码块结束后自动关闭文件,避免手动关闭的风险,同时代码更简洁。 - 把
AuditoFechaLog的计算移到循环外面,因为它的值每天只需要计算一次,不用每次循环重复处理,能提升效率。
修改后的示例代码
from datetime import date # 提前计算日期值,避免循环内重复操作 fecha_actual = str(date.today()) AuditoFechaLog = fecha_actual.replace("-", "") # 用with语句自动管理文件生命周期,添加errors参数处理编码异常 with open("POOL.PROD.IISOFENC.C522.EDMA.txt", "r", encoding="cp1252", errors="replace") as f: with open("resultado.txt", "w") as resultado: for line in f: # 增加行长度判断,避免短行触发索引错误 if len(line) >= 39: ObjetoI = line[29:39] linea1 = AuditoFechaLog + ObjetoI resultado.write(f"{linea1}\n")
额外提醒
如果你的文件里存在长度不足39的行,代码里的len(line)>=39判断可以避免IndexError;如果确定所有行都足够长,也可以去掉这个判断。
内容的提问来源于stack exchange,提问作者imnachox2
相关产品推荐
相关产品推荐

