您的数据不是用UTF-8编码的。它(主要)编码在cp1252中。数据似乎包括西班牙名字。最常见的非ASCII字符是'\xd1'(即带颚化符的拉丁文大写字母N),这是导致异常的字符。在
文件中的一个非ASCII字符是'\x8d'。它不在cp1252中。它出现在名字VASQUEZ中字母A应该出现的地方。其他的名字中,“\x94”(cp1252中的双引号)出现在名字的中间。其余的也可能代表错误。在
我建议您运行这个小代码片段来打印其中包含可疑字符的行:for lino, line in enumerate(open('sampleresults.csv')):
if any(c in line for c in '\x8d\x94\xc1\xcf\xd3'): print "%d %r\n" % (lino+1, line)
并修正数据。在
然后您需要一个csv听写器,它支持完整的和通用的解码支持。Full意味着解码字段名,也就是dict键以及数据。泛化意味着编码没有硬编码。在
导入csv
^{pr2}$
输出:[{u'\xd1': u'\xd2', u'\xff': u'\xfe'}, {u'\xd1': u'3', u'\xff': u'4'}]
下面是示例文件(仅限第一个数据行,Python2.7.1,Windows 7)的结果:>>> import csv
>>> from pprint import pprint as pp
>>> def UnicodeDictReader(str_data, encoding, **kwargs):
... csv_reader = csv.DictReader(str_data, **kwargs)
... # Decode the keys once
... keymap = dict((k, k.decode(encoding)) for k in csv_reader.fieldnames)
... for row in csv_reader:
... yield dict((keymap[k], v.decode(encoding)) for k, v in row.iteritems())
...
>>> f = open('sampleresults.csv', 'rb')
>>> drdr = UnicodeDictReader(f, 'cp1252')
>>> pp(drdr.next())
{u'APELLIDO': u'=== family names redacted ===',
u'CATEGORIA': u'ABIERTA',
u'CEDULA': u'10000640',
u'DELAY': u' 0:20',
u'EDAD': u'25',
u'EMAIL': u'mimail640',
u'NO.': u'640',
u'NOMBRE': u'=== given names redacted ===',
u'POSICION CATEGORIA': u'1',
u'POSICION CATEGORIA EN KM.5': u'11',
u'POSICION GENERAL CHIP': u'1',
u'POSICION GENERAL EN KM.5': u'34',
u'POSICION GENERAL GUN': u'1',
u'POSICION GENERO': u'1',
u'PRIMEROS 5KM.': u'0:32:55',
u'PROMEDIO/KM.': u' 5:44',
u'SEGUNDOS KM.': u'0:24:05',
u'SEX': u'M',
u'TIEMPO CHIP': u'0:56:59',
u'TIEMPO GUN': u'0:57:19'}
>>>