猿问

用Python读取UTF8CSV文件

用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)

我该怎么解决这个问题?


叮当猫咪
浏览 1550回答 3
3回答

LEATH

这个.encode方法被应用于Unicode字符串以生成字节字符串;但是您要在字节字符串上调用它.走错路了!看看codecs模块在标准库和codecs.open特别是用于读取UTF-8编码文本文件的更好的通用解决方案。但是,对于csv特别是模块,您需要传递utf-8数据,这就是您已经得到的数据,所以您的代码可以简单得多:import&nbsp;csvdef&nbsp;unicode_csv_reader(utf8_data,&nbsp;dialect=csv.excel,&nbsp;**kwargs): &nbsp;&nbsp;&nbsp;&nbsp;csv_reader&nbsp;=&nbsp;csv.reader(utf8_data,&nbsp;dialect=dialect,&nbsp;**kwargs) &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;row&nbsp;in&nbsp;csv_reader: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;[unicode(cell,&nbsp;'utf-8')&nbsp;for&nbsp;cell&nbsp;in&nbsp;row]filename&nbsp;=&nbsp;'da.csv'reader&nbsp;=&nbsp;unicode_csv_reader(open(filename)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;field1,&nbsp;field2,&nbsp;field3&nbsp;in&nbsp;reader: &nbsp;&nbsp;print&nbsp;field1,&nbsp;field2,&nbsp;field3PS:如果您的输入数据不是在utf-8中,而是在iso-8859-1中,那么您确实需要一个“转码”(如果您热衷于在csv(模块级),line.decode('whateverweirdcodec').encode('utf-8')-但是您可能只需在yield代码中的行,而不是'utf-8',如csv

慕沐林林

Python2.x有一个Unicode-CSV库,它应该可以解决您的问题,并增加了不编写任何与csv相关的新代码的好处。下面是他们自述的一个例子:>>>&nbsp;import&nbsp;unicodecsv>>>&nbsp;from&nbsp;cStringIO&nbsp;import&nbsp;StringIO>>>&nbsp;f&nbsp;=&nbsp;StringIO()>>>&nbsp;w&nbsp;=&nbsp;unicodecsv.writer(f,&nbsp;encoding='utf-8') >>>&nbsp;w.writerow((u'é',&nbsp;u'ñ'))>>>&nbsp;f.seek(0)>>>&nbsp;r&nbsp;=&nbsp;unicodecsv.reader(f,&nbsp;encoding='utf-8')>>>&nbsp;row&nbsp;=&nbsp;r.next()>>>&nbsp;print&nbsp;row[0],&nbsp;row[1]é&nbsp;ñPython 3.x在python 3中,内置程序支持开箱即用。csv模块。参见此示例:import&nbsp;csvwith&nbsp;open('some.csv',&nbsp;newline='',&nbsp;encoding='utf-8')&nbsp;as&nbsp;f: &nbsp;&nbsp;&nbsp;&nbsp;reader&nbsp;=&nbsp;csv.reader(f) &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;row&nbsp;in&nbsp;reader: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(row)
随时随地看视频慕课网APP

相关分类

Python
我要回答