二进制模式写入CSV文件时出现Ascii编码错误求助
解决ASCII编码无法写入CSV的问题
嘿,这个编码问题我之前处理过好几次,咱们来捋清楚怎么解决:
问题根源
你遇到的‘Ascii’编码无法对位置152-153的字符进行编码错误,本质是:
- 当你用二进制模式写入CSV时,Python默认会尝试用ASCII编码转换字符串,但你的数据里包含非ASCII字符(比如示例中的
\x80\x99,这是Windows-1252编码的右单引号’) - CSV模块本身设计为在文本模式下工作,二进制模式反而会绕开它的编码处理逻辑,导致编码冲突
最佳解决方案:文本模式+指定UTF-8编码
这是最稳妥的方式,直接让CSV模块处理编码和格式细节:
import csv # 你的原始数据 data = [ [None, u'https://aaa.com/p/cat.do?tags=|5555|4444|8888&zzz;A=3', u'00 .00.00.000, 00.00.00.000', u'25359725', u'2018-03-06 18:01:18', u'DC01F54GH8D.aa201', None, 1814498434, 765651, u'2018-03-12 18:01:18', 168, 0, u'2018-03-12 18: 32:08.428032'], [None, u'https://aaa.com/p/cat.do?tags=|5555|4444|8888&zzz;A=\x80\x99s+Day+', u'00.00.00.000, 00.00.00.000', u'10707456'] ] # 用文本模式打开文件,指定UTF-8编码,newline=''是CSV模块推荐的参数(避免换行符混乱) with open('output.csv', 'w', encoding='utf-8', newline='') as csv_file: writer = csv.writer(csv_file) writer.writerows(data)
关键点说明:
encoding='utf-8':UTF-8兼容所有语言的字符,彻底解决非ASCII编码问题newline='':让CSV模块自己处理换行符,避免不同操作系统下的格式错误- 文本模式下,CSV模块会自动处理字符串到字节的转换,不需要你手动编码
备选方案:二进制模式下手动编码(不推荐)
如果因为特殊需求必须用二进制模式,你需要手动把所有字符串转换成UTF-8字节:
import csv def convert_item(item): if isinstance(item, unicode): # Python 2用unicode,Python 3替换为str return item.encode('utf-8') elif item is None: return b'' # 用空字节表示None值 else: # 非字符串类型先转成字符串再编码 return unicode(item).encode('utf-8') # Python 3替换为str(item).encode('utf-8') # 把所有数据转换为字节类型 binary_data = [[convert_item(cell) for cell in row] for row in data] with open('output.csv', 'wb') as csv_file: writer = csv.writer(csv_file) writer.writerows(binary_data)
注意:
这个方法需要你手动处理所有数据类型的转换,容易出错,除非必要否则不建议使用。
额外处理:修复乱码字符
如果你的数据里有类似\x80\x99的乱码(实际是Windows-1252编码的特殊字符),可以先把它转换成标准UTF-8:
# 假设原字符串是Windows-1252编码(Python 2示例) original_str = u'A=\x80\x99s+Day+' # 先编码回字节,再用UTF-8解码 corrected_str = original_str.encode('windows-1252').decode('utf-8') # 现在corrected_str就是标准的"A=’s+Day+"
内容的提问来源于stack exchange,提问作者ABK
相关产品推荐
相关产品推荐

