Получение и отображение UTF-8 из .CSV в Python - PullRequest
0 голосов
/ 13 октября 2009

В общем, сегодня мне было очень весело. У меня есть этот файл данных с именем test.csv, который кодируется как UTF-8:

"Нгуён", 0,500 "Trần", 0,250 "Lê", 0,250

Теперь я пытаюсь прочитать его с помощью этого кода, и он показывает все смешно, как это: Trần

Теперь я просмотрел все документы по Python для 2.6, которыми я пользуюсь, и я не могу заставить оболочку работать вместе со всеми идеями в Интернете, которые, как я полагаю, все очень правильные, просто не применяются должным образом по-настоящему. С другой стороны, я понял, что не все шрифты будут правильно отображать эти символы в любом случае, о чем я раньше даже не думал, и многое узнал о Unicode и т. Д., Так что это определенно не было потраченным временем.

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

Вот код, обновленный согласно запросу ниже, который возвращает эту ошибку -

Traceback (most recent call last):
  File "surname_generator.py", line 39, in 
    probfamilynames = [(familyname,float(prob)) for familyname,prob in unicode_csv_reader(open(familynamelist))]
  File "surname_generator.py", line 27, in unicode_csv_reader
    for row in csv_reader: 
  File "surname_generator.py", line 33, in utf_8_encoder
    yield line.encode('utf-8') UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)
from random import random
import csv

class ChooseFamilyName(object):
def __init__(self, probs):
    self._total_prob = 0.
    self._familyname_levels = []
    for familyname, prob in probs:
        self._total_prob += prob
        self._familyname_levels.append((self._total_prob, familyname))
    return

def pickfamilyname(self):
    pickfamilyname = self._total_prob * random()
    for level, familyname in self._familyname_levels:
        if level >= pickfamilyname:
            return familyname
    print "pickfamilyname error"
    return

def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),
                        dialect=dialect, **kwargs)
for row in csv_reader:
    # decode UTF-8 back to Unicode, cell by cell:
    yield [unicode(cell, 'utf-8') for cell in row]

def utf_8_encoder(unicode_csv_data):
    for line in unicode_csv_data:
        yield line.encode('utf-8')

familynamelist = 'familyname_vietnam.csv'
a = 0
while a < 10:
    a = a + 1
probfamilynames = [(familyname,float(prob)) for familyname,prob in unicode_csv_reader(open(familynamelist))]
familynamepicker = ChooseFamilyName(probfamilynames)
print(familynamepicker.pickfamilyname())

Ответы [ 3 ]

1 голос
/ 14 октября 2009

unicode_csv_reader(open(familynamelist)) пытается передать не-Unicode-данные (байтовые строки с кодировкой utf-8) в функцию, которую вы написали, ожидая Unicode-данные. Вы можете решить проблему с codecs.open (из кодеков стандартного библиотечного модуля), но это обходно: кодеки будут делать для вас utf8-> unicode, тогда ваш код будет делать unicode-> utf8, какой смысл? 1002 *

Вместо этого определите функцию, более похожую на эту ...:

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

и используйте encoded_csv_reader_to_unicode(open(familynamelist)).

0 голосов
/ 14 октября 2009

Ваша текущая проблема в том, что вы получили штурмана с вещью csv_unicode_reader. Как следует из названия, и как явно указано в документации:

"" "(unicode_csv_reader () ниже - это генератор, который оборачивает csv.reader для обработки данных Unicode CSV (список строк Unicode)." ""

У вас нет Unicode-строк, у вас есть str-строки, закодированные в UTF-8.

Предложение: сдуть материал csv_unicode_reader. Получите каждую строку просто и ясно, как если бы она была закодирована в ascii. Затем преобразуйте каждую строку в Unicode:

unicode_row = [field.decode('utf8') for field in str_row]

Возвращаясь к исходной проблеме:

(1) Чтобы получить справку о шрифтах и ​​т. Д., Вам необходимо указать, на какой платформе вы работаете, и какое программное обеспечение вы используете для отображения строк Unicode.

(2) Если вам нужны независимые от платформы способы проверки ваших данных, посмотрите встроенную функцию repr () и функцию name в модуле unicodedata.

0 голосов
/ 13 октября 2009

В документации по python есть демо unicode_csv_reader: http://docs.python.org/library/csv.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...