在读取csv时csv.DictReader正在使用哪种编码?

时间:2016-05-30 15:25:59

标签: python python-2.7 csv encoding utf-8

我有一个csv文件保存编码为UTF-8。

它包含非ascii chars [umlauts]。

我正在使用以下方式阅读该文件:

csv.DictReader(<file>,delimiter=<delimiter>).

我的问题是:

  1. 正在读取的文件是哪种编码?
  2. 我注意到为了将字符串称为utf-8,我需要执行:

    str.decode('utf-8')
    

    是否有更好的方法,然后在一个编码中读取文件,然后转换为另一个,即utf-8

  3. [Python版本:2.7]

2 个答案:

答案 0 :(得分:2)

在Python 2.7中,CSV模块不应用任何解码 - 它以二进制模式打开文件并返回字节字符串。

使用https://github.com/jdunck/python-unicodecsv,即时解码。

使用它像:

with open("myfile.csv", 'rb') as my_file:    
    r = unicodecsv.DictReader(my_file, encoding='utf-8')

r将包含Unicodes的字典。源文件以binary模式打开非常重要。

答案 1 :(得分:1)

如何使用实例和类来实现这一目标?

您可以在类级别存储共享字典,并使其加载Unicode文本文件,甚至可以检测其编码,无论是否使用BOM文件掩码。

很久以前我写了一个简单的库,用一个支持Unicode的默认值覆盖了默认的open()

如果你import tendo.unicode,你将能够改变csv库加载文件的方式。

如果您的文件没有BOM表头,则库将采用UTF-8而不是旧的ascii。如果需要,您甚至可以指定其他后备编码。