如何在Python3中处理非utf8 csv文件

时间:2015-03-23 10:01:23

标签: python python-3.x

我需要处理大量CSV文件,

这些文件来自中国,所以我猜编码是非utf8

然而,文件甚至无法在Python 3中读取。

如何阅读这些文件并使用Python 3写入新文件。

这是片段

with open('20120901_20120915_ACCLOG.csv', 'r')  as f:
    sources = f.readlines()
    print(sources)

我收到错误UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb8 in position 3: invalid start byte

以下是XLS文件和示例pyhton脚本

https://github.com/poc7667/sucks_encoding_problem

2 个答案:

答案 0 :(得分:3)

打开文件时需要指定正确的编解码器。什么是正确的编解码器 我们只能猜测;你使用其中一个Chinese GB* codecs时,你上传的GitHub样本解码很好,但是那些编解码器非常渴望(未编码其中一个的文本也可以被解码,只是结果错误)。

如果已知编解码器,您需要询问这些CSV文件的来源。这可以在文档中,或在HTTP Content-Type标题中(查找charset=参数),或者通过其他元数据方式。

要在打开文件时指定编解码器,请使用encoding参数:

with open('20120901_20120915_ACCLOG.csv', 'r', encoding='gbk')  as f:

请参阅Standard Encodings表,了解Python 3可以开箱即用的编解码器;从那里可以选择各种中文编解码器。

答案 1 :(得分:2)

该文件似乎编码为GB2312。像encoding这样指定open()选项:

with open('20120901_20120915_ACCLOG.csv', encoding='GB2312') as f:
    sources = f.read()
    print(sources)

我使用chardet模块确定了编码:

>>> chardet.detect(open('20120901_20120915_ACCLOG.csv','rb').read())
{'encoding': 'GB2312', 'confidence': 0.99}

值得注意的是,有几个编解码器(编码)适用于此文件: gb2312,gbk和gb18030都产生相同的结果。 big5hkscs也可以工作,但会产生与其他三个编解码器不同的结果。我不确定哪一个是正确的,或者是否其中任何一个是正确的。

BTW,该文件似乎不是普通的CSV文件。