Reading a UTF8 CSV file with Python
我正在尝试用python(仅限法语和/或西班牙语字符)读取带有重音字符的csv文件。基于csvreader的python 2.5文档(http://docs.python.org/library/csv.html),我想出了以下代码来读取csv文件,因为csvreader只支持ASCII。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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文件的摘录:
1 2 3 4 | 0665000FS10120684,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Bleu 0665000FS10120689,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Gris 0665000FS10120687,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Vert ... |
即使我尝试编码/解码到UTF-8,我仍然得到以下异常:
1 2 3 4 5 6 7 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) |
我该怎么解决这个问题?
1 2 3 4 5 6 7 8 9 10 11 | import csv def 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格式,那么您确实需要一个"转码"(如果您希望在
Python 2 x
有一个unicode csv库可以解决您的问题,另外还有一个好处就是不用导航来编写任何与csv相关的新代码。
以下是他们自述文件中的一个示例:
1 2 3 4 5 6 7 8 9 10 | >>> 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中,这是由内置的
1 2 3 4 5 | import csv with open('some.csv', newline='', encoding='utf-8') as f: reader = csv.reader(f) for row in reader: print(row) |
同时在本帖中签出答案:https://stackoverflow.com/a/9347871/1338557
它建议使用名为ucsv.py的库。为解决Python2.7的编码问题(utf-8)而编写的csv的简短替换。还支持csv.dictleader
编辑:添加我使用的示例代码:
1 2 3 4 5 6 7 8 9 | import ucsv as csv #Read CSV file containing the right tags to produce fileObj = open('awol_title_strings.csv', 'rb') dictReader = csv.DictReader(fileObj, fieldnames = ['titles', 'tags'], delimiter = ',', quotechar = '"') #Build a dictionary from the CSV file-> {<string>:<tags to produce>} titleStringsDict = dict() for row in dictReader: titleStringsDict.update({unicode(row['titles']):unicode(row['tags'])}) |
如果您想读取编码为utf-8的csv文件,我建议您使用一种最低限度的方法,如下所示:
1 | with open(file_name, encoding="utf8") as csv_file: |
有了这个语句,您以后可以使用csv阅读器进行工作。
像亚历克斯·马泰利建议的那样使用
1 2 3 4 5 6 7 | import codecs delimiter = ';' reader = codecs.open("your_filename.csv", 'r', encoding='utf-8') for line in reader: row = line.split(delimiter) # do something with your row ... |
对于python 2.6来说,到帮助页面的链接是相同的,据我所知,自从2.5以来,csv模块没有任何变化(除了错误修复)。这里是不需要任何编码/解码就可以工作的代码(文件da.csv包含与变量数据相同的数据)。我假设您的文件应该在不进行任何转换的情况下正确读取。
测试:PY:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | ## -*- coding: utf-8 -*- # # NOTE: this first line is important for the version b) read from a string(unicode) variable # import csv data = \ """0665000FS10120684,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Bleu 0665000FS10120689,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Gris 0665000FS10120687,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Vert""" # a) read from a file print 'reading from a file:' for (f1, f2, f3) in csv.reader(open('da.csv'), dialect=csv.excel): print (f1, f2, f3) # b) read from a string(unicode) variable print 'reading from a list of strings:' reader = csv.reader(data.split(' '), dialect=csv.excel) for (f1, f2, f3) in reader: print (f1, f2, f3) |
DA.CSV:
1 2 3 | 0665000FS10120684,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Bleu 0665000FS10120689,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Gris 0665000FS10120687,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Vert |
查看
1 2 3 4 5 | >>> u'\u00e9' u'\xe9' >>> u'\u00e9'.encode('utf-8') '\xc3\xa9' >>> |
我建议您在调用特殊的