在python中使用unicodecsv阅读器时出现问题

时间:2016-04-04 04:40:22

标签: python csv unicode

我在使用unicodecsv阅读器时遇到了麻烦。我一直在寻找如何使用该模块的不同示例,但每个人都在不断引用unicodecsv网站(或某些类似的变体)中的确切示例。

import unicodecsv as csv
from io import BytesIO
f = BytesIO()
w = csv.writer(f, encoding='utf-8')
_ = w.writerow((u'é', u'ñ'))
_ = f.seek(0)
r = csv.reader(f, encoding='utf-8')
next(r) == [u'é', u'ñ']
>>> True

对我来说,这个例子对我们的理解做了太多假设。它看起来不像传递csv文件。我完全错过了这个阴谋。

我想做的是:

  1. 读取csv文件的第一行是标题
  2. 阅读剩余的行并将其放入字典中
  3. 我的破码:

    import unicodecsv
    #
    i = 0
    myCSV = "$_input.csv"
    dic = {}
    #
    f = open(myCSV, "rb")
    reader = unicodecsv.reader(f, delimiter=',')
    strHeader = reader.next()
    #
    # read the first line of csv
    # use custom function to parse the header
    myHeader = FNC.PARSE_HEADER(strHeader)
    #
    # read the remaining lines
    # put data into dictionary of class objects
    for row in reader:
        i += 1
        dic[i] = cDATA(myHeader, row)
    

    而且,正如预期的那样,我得到'UnicodeDecodeError'。也许上面的例子有答案,但它们完全超出了我的想法。

    有人可以修改我的代码吗?我已经没有头发了。

    我将阅读器线切换到:

    reader = unicodecsv.reader(f, encoding='utf-8')
    

    回溯: 读者行: 文件“C:\ Python27 \ unicodecsv \ py2.py”,接下来的第128行   对于行中的值]

    UnicodeDecodeError:'utf8'编解码器无法解码位置48中的字节0x90:invalide start byte

    当我使用以下方式严格打印数据时

    f = open(myCSV, "rb")
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        print(str[row[9]] + '\n')
        print(repr(row[9] + '\n')
    >>> UTAS ? Offline
    >>> 'UTAS ? Offline'
    

2 个答案:

答案 0 :(得分:4)

创建阅读器时需要声明输入文件的编码,就像创建编写器时一样:

>>> import unicodecsv as csv
>>> with open('example.csv', 'wb') as f:
...     writer = csv.writer(f, encoding='utf-8')
...     writer.writerow(('heading0', 'heading1'))
...     writer.writerow((u'é', u'ñ'))
...     writer.writerow((u'ŋ', u'ŧ'))
... 
>>> with open('example.csv', 'rb') as f:
...     reader = csv.reader(f, encoding='utf-8')
...     headers = next(reader)
...     print headers
...     data = {i: v for (i, v) in enumerate(reader)}
...     print data
... 
[u'heading0', u'heading1']
{0: [u'\xe9', u'\xf1'], 1: [u'\u014b', u'\u0167']}

打印字典显示数据的转义表示,但您可以通过单独打印来查看字符:

>>> for v in data.values():
...     for s in v:
...         print s
... 
é
ñ
ŋ
ŧ

编辑:

如果文件的编码未知,那么最好使用chardet之类的编码来确定处理前的编码。

答案 1 :(得分:0)

如果您的最终目标是读取csv文件并将数据转换为dicts,那么我建议使用 csv.DictReader 。 DictRead将负责读取标题并将其余行转换为Dict(rowdicts)。这使用CSV模块,其中包含大量可用的文档/示例。

>>> import csv
>>> with open('names.csv') as csvfile:
...     reader = csv.DictReader(csvfile)
...     for row in reader:
...         print(row['first_name'], row['last_name'])

为了更清晰,请在此处查看示例https://docs.python.org/2/library/csv.html#csv.DictReader