Python 2.7读写CSV文件utf-8-sig编码异常问题求助
解决Python 2.7中UTF-8-SIG编码读写CSV的BOM乱码问题
看起来你遇到的是Python 2.7里UTF-8 BOM(字节顺序标记)处理不当导致的乱码问题。先帮你拆解下问题根源,再给你针对性的修复方案:
问题分析
你读取到的表头['\xef\xbb\xbfID;timestamp;CustomerID;Email']里,\xef\xbb\xbf就是UTF-8的BOM标识。Python 2.7的原生open()函数不支持指定编码参数,默认用系统编码(比如Windows下的GBK)读写文件:
- 读取时如果没指定
utf-8-sig,BOM会被当成普通字符保留在字符串里; - 写入时如果还是用系统编码,这个BOM字符会被错误解析成乱码(就是你看到的“Ôªø”)。
修复方案
Python 2.7里需要用io或codecs模块的open()函数来处理编码,它们支持指定encoding参数。下面是修改后的函数代码片段:
import io import csv import os def remove_gdpr_info_from_csv(file_path, file_name, temp_folder, original_header): # 1. 读取CSV:用utf-8-sig编码自动去除BOM with io.open(file_path, 'r', encoding='utf-8-sig') as input_file: reader = csv.reader(input_file, delimiter=';') # 读取表头(此时已经自动去掉BOM了) header = next(reader) # 如果你需要基于传入的original_header处理,先清理掉BOM cleaned_original_header = original_header[0].replace('\xef\xbb\xbf', '') # 2. 写入CSV:用utf-8-sig编码自动添加正确的BOM output_path = os.path.join(temp_folder, file_name) with io.open(output_path, 'w', encoding='utf-8-sig', newline='') as output_file: writer = csv.writer(output_file, delimiter=';') # 写入清理后的表头(utf-8-sig会自动在文件开头加BOM) writer.writerow(cleaned_original_header.split(';')) # 后续写入数据行的逻辑...
关键细节说明
- 读取时用
utf-8-sig:这个编码会自动识别并移除文件开头的BOM,避免表头字符串里混入\xef\xbb\xbf; - 写入时用
utf-8-sig:它会自动在文件开头添加标准的UTF-8 BOM,保证文件格式正确,不会出现乱码; - 清理传入的
original_header:如果你的original_header已经带BOM,一定要先替换掉再写入,否则会导致文件里出现重复的BOM字符; newline=''参数:Python 2.7里配合csv模块使用时,加上这个可以避免写入时出现多余的空行。
验证方法
写入完成后,你可以用文本编辑器(比如Notepad++)打开B.csv,查看编码格式是否为“UTF-8-BOM”,表头应该正常显示为ID;timestamp;CustomerID;Email。
内容的提问来源于stack exchange,提问作者SharpLu
相关产品推荐
相关产品推荐

