2016-04-04 2 views
0

У меня возникли проблемы с использованием читателя unicodecsv. Я продолжаю искать разные примеры использования модуля, но каждый продолжает ссылаться на точный образец с веб-сайта unicodecsv (или на некоторые аналогичные варианты).проблема с читателем unicodecsv в python

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') 

Traceback: для строки в считывающем: Файл "C: \ python27 \ unicodecsv \ py2.py", строка 128 в следующем для значения в строке ]

UnicodeDecodeError: 'utf8' кодек не может декодировать байт 0x90 в положении 48: invalide начать байт

Когда я строго печать данных с помощью:

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' 

ответ

3

Вы должны объявить кодировку входного файла при создании читателя, так же, как вы делали при создании писателя:

>>> 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 
... 
é 
ñ 
ŋ 
ŧ 

EDIT:

Если кодировка файла Неизв собственный, тогда лучше всего использовать некоторые, например chardet, для определения кодировки перед обработкой.

+0

1) Вы показываете «писатель» затем «читателя». Нужен ли писатель?Или это только в том случае, если кто-то создает файл csv? В моем случае кто-то отправляет мне файл csv, и я обрабатываю информацию. Мой код работал нормально, пока один из полей не добавил символы Unicode. 2) Я попробовал добавить «endcoding = 'utf-8» на строку «reader», и он выбросил ошибку - что-то вроде строк не распознанной входной строки для этого параметра - я пишу это из памяти, m не на моей рабочей станции. – twegner

+0

(1) Раздел записи предназначен только для примера. Код считывателя не зависит от того, как создается файл (хотя он принимает действительный файл csv, закодированный как utf-8. (2) Пожалуйста, отредактируйте свой вопрос с помощью вашего нового кода и полной трассировки, когда вы получите возможность. «unicode» в вашем файле также может оказаться полезным. – snakecharmerb

+0

Возможно, ваши данные не кодируются как utf-8. На основе http://stackoverflow.com/questions/6180521/unicodedecodeerror-utf8-codec-cant-decode-bytes -in-position-3-6-invalid-dat, попробуйте изменить кодировку на «latin-1». Существуют кодировки ISO-8859-X для разных языков, которые вы могли бы попробовать увидеть https://en.wikipedia.org/ wiki/ISO/IEC_8859-1 – snakecharmerb

1

Если ваша конечная цель считывается csv-файлом и преобразует данные в dicts, я бы рекомендовал использовать csv.DictReader. DictRead позаботится о чтении заголовка и преобразовании остальной части строк в Dict (rowdicts). Это использует CSU moduels, который содержит много документации/пример.

>>> 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

+0

Файл csv содержит символы Unicode? Utf-8, поэтому мне нужно использовать модуль unicodecsv, а не обычный csv. Когда я удаляю поля Unicode из файла csv, код работает нормально. Его Unicode и как обрабатывать его, что ускользает от меня. – twegner

+0

Затем можно преобразовать этот формат utf-8 в ascii. Если вы используете Python3. то вам повезло. UTF8 теперь является стандартным форматом для python3. В противном случае у нас есть множество инструментов и методов для преобразования форматов кодировки файлов. Даже Notepad ++ может помочь вам в этом. Попробуй. Удачи. – Sampath

+0

Также попробуйте проверить это http://stackoverflow.com/questions/904041/reading-a-utf8-csv-file-with-python – Sampath

Смежные вопросы