【问题标题】:trouble with unicodecsv reader in pythonpython中unicodecsv阅读器的问题
【发布时间】:2016-04-04 04:40:21
【问题描述】:

我在使用 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. 阅读剩余的行并将它们放入字典中

我的破代码:

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' codec can't decode byte 0x90 in position 48: 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'

【问题讨论】:

    标签: python csv unicode


    【解决方案1】:

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

    >>> 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) 您展示的是“作者”,然后是“读者”。需要作者吗?还是只有在有人创建 csv 文件时才这样做?就我而言,有人向我发送了一个 csv 文件,而我正在处理这些信息。我的代码运行良好,直到有一天其中一个字段添加了 Unicode 字符。 2)我尝试在'reader'行上添加“endcoding='utf-8'”,它抛出了一个错误-类似于该参数的无法识别的输入字符串-我是从内存中写的,我'我不在我的工作站。
    • (1) writer 部分仅用于示例目的。阅读器代码与文件的创建方式无关(尽管它假定编码为 utf-8 的有效 csv 文件。(2)请在有机会时使用新代码和完整回溯编辑您的问题。您文件中的“unicode”也可能会有所帮助。
    • 可能您的数据未编码为 utf-8。基于stackoverflow.com/questions/6180521/…,尝试将编码更改为“latin-1”。有各种语言的 ISO-8859-X 编码,您可以尝试查看 en.wikipedia.org/wiki/ISO/IEC_8859-1
    • 是的,我也这么认为。有些数据是国际数据。到现在为止都不是问题。我担心如果我选择特定的编码,这一次它会起作用,但下次数据/源发生变化时可能不会。我想与其他人共享此代码,但我不希望它有问题。有没有办法用许多不同的编码来愚弄它?也许是一堆 TRY 语句?
    • 在这种情况下,我认为您需要合适的工具。我在回答中提出了建议。我认为这就是我们可以解决这个问题的程度。祝你好运!
    【解决方案2】:

    如果您的最终目标是读取 csv 文件并将数据转换为字典,那么我建议您使用 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

    【讨论】:

    • csv 文件包含 Unicode ?utf-8 字符,所以我需要使用 unicodecsv 模块,而不是常规的 csv 模块。当我从 csv 文件中删除 Unicode 字段时,代码可以正常工作。它的 Unicode 以及如何处理它让我无法理解。
    • 然后让我们将这个 utf-8 转换为 ascii 格式。如果您使用的是 Python3,.那么你很幸运。 UTF8 现在是 python3 的标准格式。否则,我们有很多工具和方法来转换文件编码格式。甚至 Notepad++ 也可以帮助您。尝试一下。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多