我在使用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文件。我完全错过了这个阴谋。
我想做的是:
我的破码:
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'
答案 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