自动以正确的编码方式打开文件

7

我在处理几个关于编码的文件时遇到了一些问题。我们从另外一家公司接收到csv格式的文件并需要读取它们。

奇怪的是,这些文件似乎是以UTF-16的编码方式进行编码的。我设法解决了这个问题,但是必须使用codecs模块打开它们并指定编码方式,如下所示。

ENCODING = 'utf-16'
with codecs.open(test_file, encoding=ENCODING) as csv_file:
    # Autodetect dialect
    dialect = csv.Sniffer().sniff(descriptor.read(1024))
    descriptor.seek(0)
    input_file = csv.reader(descriptor, dialect=dialect)

    for line in input_file:
       do_funny_things()

但是,就像我能够以更加不可知论的方式获取方言一样,我认为自动以正确的编码方式打开文件将是很好的,至少对于所有文本文件。还有其他程序,比如vim可以实现这一点。

有人知道在Python 2.6中如何做到这一点吗?

附注:我希望在Python 3中解决这个问题,因为所有字符串都是Unicode...


1
Python 3并没有解决这个问题,它只是在open()函数中添加了encodingerrors参数。 - Ignacio Vazquez-Abrams
4个回答

13

chardet可以帮助你。

在Python 2和3中进行字符编码自动检测。与您的浏览器一样智能。开源。


6
在Python 3中它无法被“修复”,因为这不是一个可解决的问题。许多文档可以使用多种编码进行验证,因此确定正确的编码方式的唯一方法是了解文档的某些信息。幸运的是,在大多数情况下,我们确实知道一些关于文档的信息,比如说,大多数字符会聚集在不同的Unicode块中。英语文档将主要包含前128个代码点内的字符。俄语文档将主要包含西里尔字母代码点。大多数文档将包含空格和换行符。这些线索可以用来帮助您猜测正在使用哪些编码方式。更好的方法是使用已经完成工作的人编写的库(例如由Desintegr提到的chardet)。

0

在2.x版本中,csv.reader无法处理Unicode字符串。请参考csv文档底部和这个问题以了解如何处理它。


-3

如果在Python 3中修复了这个问题,也应该通过使用来进行修复

from __future__ import unicode_literals

2
显然,这只意味着你的字符串是Unicode编码,而不是你可以直接从文件上传Unicode编码的内容... 另外它是UTF-8。 - Khelben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接