簡體   English   中英

python中的unicodecsv閱讀器出現問題

[英]trouble with unicodecsv reader in python

我在使用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'編解碼器無法解碼位置48的字節0x90:無效的起始字節

當我嚴格使用以下命令打印數據時:

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'

創建讀取器時,您需要聲明輸入文件的編碼,就像創建寫入器時一樣:

>>> 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之類的文件來確定編碼。

如果您的最終目標是讀取csv文件並將數據轉換為字典,則建議使用csv.DictReader DictRead將負責讀取標頭並將其余的行轉換為Dict(行)。 這使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM