2016-03-21 6 views
-2

Сообщество Hello StackOverflow.Проблема с кодировкой Unicode в Python

Я довольно новый пользователь Python, поэтому извините заранее за глупость этого вопроса! Но я пытался исправить это в течение нескольких часов, но до сих пор не понял.

Я пытаюсь импортировать большой набор данных текста для управления им в Python.

Этот набор данных находится в .csv, и у меня были проблемы с его чтением из-за проблем с кодировкой.

Я пытался кодировать его в UTF-8 текст с блокнотом ++ Я попробовал модуль csv.reader в Python

Вот пример моего кода:

import csv 
with open('twitter_test_python.csv') as csvfile: 
    #for file5 in csvfile: 
    # file5.readline() 
    #csvfile = csvfile.encode('utf-8') 
    spamreader = csv.reader(csvfile, delimiter=str(','), quotechar=str('|') 
    for row in spamreader: 
     row = " ".join(row) 
     row2= str.split(row) 
    listsw = [] 
    for mots in row2: 
     if mots not in sw: 
      del mots 
    print row2 

Но когда я импортировать мои данные в Python У меня все еще есть проблемы с кодировкой (акценты и т. д.), независимо от того, какой метод я использую.

Как я могу кодировать свои данные так, чтобы их можно было правильно читать с помощью Python?

Спасибо!

+0

* У меня все еще есть проблемы с кодировкой * означает точно ничего! Скажите, что происходит точно и что ожидается. –

+0

Вот пример списка из моих данных: [u "En vrai j'en ai marre j'ai une poste \ xe0 3min de chez moi et le postier il d \ xe9cide de mettre mon colis dans une poste que je connais pas "]. –

+0

Я хочу иметь это: [En vrai j'en ai marre j'ai une poste à 3min de chez moi et le postier il décide de mettre mon colis dans une poste que je connais pas] –

ответ

0

модуль CSV documentation приведен пример того, как иметь дело с Юникод:

import csv,codecs,cStringIO 

class UTF8Recoder: 
    def __init__(self, f, encoding): 
     self.reader = codecs.getreader(encoding)(f) 
    def __iter__(self): 
     return self 
    def next(self): 
     return self.reader.next().encode("utf-8") 

class UnicodeReader: 
    def __init__(self, f, dialect=csv.excel, encoding="utf-8-sig", **kwds): 
     f = UTF8Recoder(f, encoding) 
     self.reader = csv.reader(f, dialect=dialect, **kwds) 
    def next(self): 
     '''next() -> unicode 
     This function reads and returns the next line as a Unicode string. 
     ''' 
     row = self.reader.next() 
     return [unicode(s, "utf-8") for s in row] 
    def __iter__(self): 
     return self 

class UnicodeWriter: 
    def __init__(self, f, dialect=csv.excel, encoding="utf-8-sig", **kwds): 
     self.queue = cStringIO.StringIO() 
     self.writer = csv.writer(self.queue, dialect=dialect, **kwds) 
     self.stream = f 
     self.encoder = codecs.getincrementalencoder(encoding)() 
    def writerow(self, row): 
     '''writerow(unicode) -> None 
     This function takes a Unicode string and encodes it to the output. 
     ''' 
     self.writer.writerow([s.encode("utf-8") for s in row]) 
     data = self.queue.getvalue() 
     data = data.decode("utf-8") 
     data = self.encoder.encode(data) 
     self.stream.write(data) 
     self.queue.truncate(0) 

    def writerows(self, rows): 
     for row in rows: 
      self.writerow(row) 

with open('twitter_test_python.csv','rb') as spamreader: 
    reader = UnicodeReader(fin) 
    for line in reader: 
     #do stuff 
     print line 
0

Alexey Smirnov's answer элегантен, но может быть немного сложным для новичка. Поэтому позвольте мне привести пример ближе к коду в вопросе.

Когда вы читаете файлы с Python 2, вы получаете контент как str, а не unicode. Возможно, вы захотите преобразовать его как можно скорее. Однако, documentation of the csv module говорит: «Эта версия модуля csv не поддерживает ввод Unicode». Поэтому вы должны кодировать вывод csv.reader, а не ввод. Вставка его в результаты кода в:

import csv 
with open('twitter_test_python.csv') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=str(','), quotechar=str('|')) 
    for row in spamreader: 
     row = " ".join(row) 
     row = unicode(row, encoding="utf-8") 
     row2 = row.split() 

Однако, вы можете рассмотреть вопрос о присоединении клетки просто разделить их снова на самом деле то, что вы хотите. Без этого код будет выглядеть следующим образом. Результат отличается, если элементы списка содержат пробелы.

import csv 
with open('twitter_test_python.csv') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=str(','), quotechar=str('|')) 
    for row in spamreader: 
     row2 = list(unicode(cell, encoding="utf-8") for cell in row) 

Если вы хотите написать что-то обратно в файл, вы должны преобразовать unicode первый обратно к str как unicode.encode("utf-8").

+0

Спасибо за ответ. Это значит, что я могу работать с данными, даже если это не выглядит хорошо на Python? –

+0

Да, вы можете обрабатывать unicode с помощью python. Учитывая ваши новые комментарии, я предполагаю, что вы ссылаетесь на вывод 'print'. Вас могут заинтересовать различия ['str()' vs 'repr()'] (http://stackoverflow.com/questions/19331404/str-vs-repr-functions-in-python-2-7- 5). 'print' использует' str' -представление. «List» использует для него 'str' -представление' repr'-представление его элементов. Для получения желаемого результата используйте 'print '[" + "," .join (row2) + "]" '. – jakun