python csv模块 reader_python模块,如csvDictReader,完全支持utf8

您的数据不是用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'}

>>>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值