Чтение файла CSV UTF8 с Python

String[] parts = "hello@example.com".Split(new[]{ '@' });
String username = parts[0]; // "hello"
String domain = parts[1]; // "example.com"
90
задан MERose 21 May 2015 в 20:21
поделиться

3 ответа

Метод .encode применяется к строке Unicode для создания байтовой строки; но вместо этого вы вызываете его в байтовой строке ... неправильно! Посмотрите на модуль codecs в стандартной библиотеке и на codecs.open , в частности, на лучшие общие решения для чтения текстовых файлов в кодировке UTF-8. Однако для модуля csv , в частности, вам необходимо передать данные utf-8, и это то, что вы уже получаете, поэтому ваш код может быть намного проще:

import csv

def unicode_csv_reader(utf8_data, dialect=csv.excel, **kwargs):
    csv_reader = csv.reader(utf8_data, dialect=dialect, **kwargs)
    for row in csv_reader:
        yield [unicode(cell, 'utf-8') for cell in row]

filename = 'da.csv'
reader = unicode_csv_reader(open(filename))
for field1, field2, field3 in reader:
  print field1, field2, field3 

PS: если он окажется что ваши входные данные НЕ в utf-8, но, например, в ISO-8859-1, тогда вам нужно «перекодирование» (если вы хотите использовать utf-8 в модуле csv level) в форме line.decode ('anyweirdcodec'). encode ('utf-8'

110
ответ дан 24 November 2019 в 07:01
поделиться

Глядя на таблицу юникода Latin-1 , я вижу код символа 00E9 « СТРОЧНАЯ ЛАТИНСКАЯ БУКВА E С ОСТРЫМ ". Это символ с ударением в ваших данных выборки. Простой тест в Python показывает, что кодировка UTF-8 для этого символа отличается от кодировки Unicode (почти UTF-16 ).

>>> u'\u00e9'
u'\xe9'
>>> u'\u00e9'.encode('utf-8')
'\xc3\xa9'
>>> 

Я предлагаю вы пытаетесь кодировать ("UTF-8") данные Unicode перед вызовом специального unicode_csv_reader () . Простое чтение данных из файла может скрыть кодировку, поэтому проверьте фактические значения символов.

0
ответ дан 24 November 2019 в 07:01
поделиться

Ссылка на страницу справки такая же для python 2.6 и как Насколько я знаю, с версии 2.5 не было никаких изменений в модуле csv (кроме исправлений ошибок). Вот код, который работает без кодирования / декодирования (файл da.csv содержит те же данные, что и переменная data ). Я предполагаю, что ваш файл должен читаться правильно без каких-либо преобразований.

test.py:

## -*- coding: utf-8 -*-
#
# NOTE: this first line is important for the version b) read from a string(unicode) variable
#

import csv

data = \
"""0665000FS10120684,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Bleu
0665000FS10120689,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Gris
0665000FS10120687,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Vert"""

# a) read from a file
print 'reading from a file:'
for (f1, f2, f3) in csv.reader(open('da.csv'), dialect=csv.excel):
    print (f1, f2, f3)

# b) read from a string(unicode) variable
print 'reading from a list of strings:'
reader = csv.reader(data.split('\n'), dialect=csv.excel)
for (f1, f2, f3) in reader:
    print (f1, f2, f3)

da.csv:

0665000FS10120684,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Bleu
0665000FS10120689,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Gris
0665000FS10120687,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Vert
1
ответ дан 24 November 2019 в 07:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: