为了账号安全,请及时绑定邮箱和手机立即绑定

用Python读取UTF8CSV文件

用Python读取UTF8CSV文件

叮当猫咪 2019-07-10 16:48:56
用Python读取UTF8CSV文件我试图用Python读取带有重音字符的CSV文件(只有法语和/或西班牙语字符)。基于用于csvReader的Python2.5文档(http://docs.python.org/library/csv.html),我想出了下面的代码来读取CSV文件,因为csvReader只支持ASCII。def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):     # csv.py doesn't do Unicode; encode temporarily as UTF-8:     csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),                             dialect=dialect, **kwargs)     for row in csv_reader:         # decode UTF-8 back to Unicode, cell by cell:         yield [unicode(cell, 'utf-8') for cell in row]def utf_8_encoder(unicode_csv_data):     for line in unicode_csv_data:         yield line.encode('utf-8')filename = 'output.csv'reader = unicode_csv_reader(open(filename))try:     products = []     for field1, field2, field3 in reader:         ...下面是我正在读的CSV文件的摘录:0665000FS10120684,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS)  - Bleu0665000FS10120689,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) -   Gris0665000FS10120687,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Vert...尽管我试图对UTF-8进行编码/解码,但我仍然得到以下异常:Traceback (most recent call last):   File ".\Test.py", line 53, in <module>     for field1, field2, field3 in reader:   File ".\Test.py", line 40, in unicode_csv_reader    for row in csv_reader:   File ".\Test.py", line 46, in utf_8_encoder    yield line.encode('utf-8', 'ignore')UnicodeDecodeError:    'ascii' codec can't decode byte 0xc3 in position 68: ordinal not in range(128)我该怎么解决这个问题?
查看完整描述

3 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

这个.encode方法被应用于Unicode字符串以生成字节字符串;但是您要在字节字符串上调用它.走错路了!看看codecs模块在标准库和codecs.open特别是用于读取UTF-8编码文本文件的更好的通用解决方案。但是,对于csv特别是模块,您需要传递utf-8数据,这就是您已经得到的数据,所以您的代码可以简单得多:

import csvdef unicode_csv_reader(utf8_data, dialect=csv.excel, **kwargs):
    csv_reader = csv.reader(utf8_data, dialect=dialect, **kwargs)
    for row in csv_reader:
        yield [unicode(cell, 'utf-8') for cell in row]filename = 'da.csv'reader = unicode_csv_reader(open(filename))
        for field1, field2, field3 in reader:
  print field1, field2, field3

PS:如果您的输入数据不是在utf-8中,而是在iso-8859-1中,那么您确实需要一个“转码”(如果您热衷于在csv(模块级),line.decode('whateverweirdcodec').encode('utf-8')-但是您可能只需在yield代码中的行,而不是'utf-8',如csv


查看完整回答
反对 回复 2019-07-10
?
慕沐林林

TA贡献2016条经验 获得超9个赞

Python2.x

有一个Unicode-CSV库,它应该可以解决您的问题,并增加了不编写任何与csv相关的新代码的好处。

下面是他们自述的一个例子:

>>> import unicodecsv>>> from cStringIO import StringIO>>> f = StringIO()>>> w = unicodecsv.writer(f, encoding='utf-8')
>>> w.writerow((u'é', u'ñ'))>>> f.seek(0)>>> r = unicodecsv.reader(f, encoding='utf-8')>>> row = r.next()>>> print row[0], row[1]é ñ

Python 3.x

在python 3中,内置程序支持开箱即用。csv模块。参见此示例:

import csvwith open('some.csv', newline='', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)


查看完整回答
反对 回复 2019-07-10
  • 3 回答
  • 0 关注
  • 1549 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信