You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修复混合编码CSV文件中的编码错误问题

解决混合编码CSV文件的乱码问题

问题分析

你的CSV文件属于混合编码场景:大部分内容是ISO-8859-1编码,部分条目是UTF-8编码。直接用单一编码读取会触发两种问题:要么UTF-8模式下遇到ISO-8859-1字节抛出解码错误,要么ISO-8859-1模式下读取UTF-8字节产生乱码(mojibake)。你之前的代码存在两个核心问题:

  1. 循环中修改line后未更新原Lines列表,导致ftfy的修复完全未生效
  2. 一次性读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 10:52:41