2013-07-08 2 views
1

У меня проблема с чтением символов юникода из csv. Файл CSV первоначально были элементы с Юникода тегами:Чтение Юникода из CSV

  1. "[u'Aeron\xe1utica']"
  2. "[u'Ni\u0161']"
  3. "[u'K\xfcnste']" ...

, из которого я должен был удалить и '' метки, чтобы дать CSV с

  1. Aeron\xe1utica
  2. Ni\u0161
  3. K\xfcnste ....

Теперь я хочу, чтобы прочитать файл CSV и выводит его в файл с символами, т.е.

  1. Aeronáutica
  2. Niš
  3. Künste ....

Я попытался с помощью UnicodeWriter в csv docs, но это дает тот же результат, что и во втором списке

Вот что я сделал, чтобы читать и писать:

c = open('foo.csv','r') 
r = csv.reader(c) 
for row in reader: 
p = p + row 
#The elements in p were ['Aeron\\xe1utica', 'Ni\\u0161', 'K\\xfcnste'...] 
c = open('bar.csv','w') 
c.write(codecs.BOM_UTF8) 
writer = UnicodeWriter(c) 
for row in p: 
writer.writerow([row]) 

Я также попытался codecs.open ('', '', 'UTF-8') для чтения и записи, но это не помогло

+2

Нет, вы * не * нужно удалить 'u'. Это значения Unicode, вы * хотите * значения unicode. –

+1

И при чтении CSV с закодированными символами, почему бы не использовать 'UnicodeReader'? –

+1

Чтобы уточнить: '' [u'Aeron \ xe1utica '] 'буквальный текст внутри вашего файла - если нет - что это такое? –

ответ

0

Похоже, вы написали списки Python непосредственно в CSV-файл, в результате чего вместо текстового синтаксиса [...] вместо нормальные столбцы. Затем вы удалили большую часть информации, которая могла быть использована для повторной передачи информации в списки Python с помощью строк unicode.

У вас остались литералы в формате Юникод Python, но без кавычек. Используйте unicode_escape снова декодировать значения Unicode:

with open('foo.csv','r') as b0rken 
    for line in b0rken: 
     value = line.rstrip('\r\n').decode('unicode_escape') 
     print value 

или добавить обратно u'..' квотирование, используя тройные кавычки в попытке избежать необходимости избежать внедренных кавычек:

with open('foo.csv','r') as b0rken 
    for line in b0rken: 
     value = literal_eval("u'''{}'''".format(line.rstrip('\r\n'))) 
     print value 

Если у вас все еще есть исходный файл (с форматированными линиями [u'...']), используйте функцию ast.literal_eval(), чтобы вернуть их обратно в списки Python. Нет смысла использовать модуль CSV здесь:

from ast import literal_eval 

with open('foo.csv','r') as b0rken 
    for line in b0rken: 
     lis = literal_eval(line) 
     value = lis[0] 
     print value 

Демо с unicode_escape:

>>> for line in b0rken: 
...  print line.rstrip('\r\n').decode('unicode_escape') 
... 
Aeronáutica 
Niš 
Künste 
École de l'Air 
+0

Спасибо, _almost there_, но за небольшую проблему. Некоторые элементы уже имеют «характер в них ex: \ xc9cole de l'Air. это дает об ошибке Файл «», строка 1 и «\ xc9cole де l'Air» ^ SyntaxError: неверный синтаксис Конечно, я могу заменить его легко пройти его, но любой прямой метод быть более полезным – KBhokray

+0

@KBhokray: просто используйте подход 'unicode_escape' или используйте строку с тремя кавычками. –

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