修复混合编码CSV文件中的编码错误问题
解决混合编码CSV文件的乱码问题
问题分析
你的CSV文件属于混合编码场景:大部分内容是ISO-8859-1编码,部分条目是UTF-8编码。直接用单一编码读取会触发两种问题:要么UTF-8模式下遇到ISO-8859-1字节抛出解码错误,要么ISO-8859-1模式下读取UTF-8字节产生乱码(mojibake)。你之前的代码存在两个核心问题:
- 循环中修改
line后未更新原Lines列表,导致ftfy的修复完全未生效 - 一次性读取40MB文件到内存,效率低且可能引发内存压力
方案1:二进制逐行判断编码(推荐)
以二进制模式读取文件,对每行先尝试UTF-8解码,失败则 fallback 到ISO-8859-1解码,精准处理混合编码行:
import os source_path = os.path.join(folder, file + config.CSV_EXTENSION) target_path = os.path.join(folder, file + "_temp" + config.CSV_EXTENSION) with open(source_path, "rb") as infile, open(target_path, "w", encoding="utf-8") as outfile: for byte_line in infile: try: # 优先尝试UTF-8解码 text_line = byte_line.decode("utf-8") except UnicodeDecodeError: # 解码失败则用ISO-8859-1解码 text_line = byte_line.decode("iso-8859-1") outfile.write(text_line) # 替换原文件 os.remove(source_path) os.rename(target_path, source_path)
方案2:修正原ftfy代码的问题
如果坚持用ftfy修复mojibake,需正确更新列表元素,同时改用逐行处理降低内存占用:
import os import ftfy source_path = os.path.join(folder, file + config.CSV_EXTENSION) target_path = os.path.join(folder, file + "_temp" + config.CSV_EXTENSION) with open(source_path, "r", encoding="iso-8859-1") as infile, open(target_path, "w", encoding="utf-8") as outfile: for line in infile: # 修复UTF-8字节被ISO-8859-1错误解码产生的乱码 fixed_line = ftfy.fix_encoding(line) outfile.write(fixed_line) os.remove(source_path) os.rename(target_path, source_path)
关键说明
- 你提到的
Ãberarbeitung A6 Heft是典型的UTF-8字节被ISO-8859-1错误解码导致的mojibake,ftfy.fix_encoding()可以自动识别修复这类问题,但原代码因未更新列表导致修复未生效。 - 二进制模式读取是处理混合编码文件的通用思路,避免了文本模式下的编码强制转换限制。
- 使用
with语句管理文件,无需手动关闭,更安全可靠。
内容的提问来源于stack exchange,提问作者dibade89
相关产品推荐
相关产品推荐

