Подтвердить что ты не робот

Кодирование кода кодирования Unicode Python не в диапазоне <128> с знаком Euro

Мне нужно прочитать XML файл на Python и захватить различные вещи, и я столкнулся с разочаровывающей ошибкой с Unicode Encode Error, которую я не мог понять даже с помощью googling.

Вот фрагменты моего кода:

#!/usr/bin/python
# coding: utf-8
from xml.dom.minidom import parseString
with open('data.txt','w') as fout:
   #do a lot of stuff
   nameObj = data.getElementsByTagName('name')[0]
   name = nameObj.childNodes[0].nodeValue
   #... do more stuff
   fout.write(','.join((name,bunch of other stuff))

Это впечатляюще сбой, когда имя, которое я обрабатываю, содержит знак Euro. Вот ошибка:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 60: ordinal not in range(128)

Я понимаю, почему знак Euro подведет его (потому что он на 128, верно?), но я думал, что нужно делать # кодирование: utf-8 исправит это. Я также попытался добавить .encode(utf-8), чтобы вместо него выглядело имя

name = nameObj.childNodes[0].nodeValue.encode(utf-8)

Но это тоже не работает. Что я делаю не так? (Я использую Python 2.7.3, если кто-то хочет знать)

РЕДАКТИРОВАТЬ: Python выходит из строя в строке fout.write() - он будет проходить отлично, где поле имени похоже:

<name>United States, USD</name>

Но будет дерьмо на поля имени, например:

<name>France, € </name>
4b9b3361

Ответ 1

когда вы открываете файл в python с помощью встроенной функции open, вы всегда будете читать файл в ascii. Чтобы получить доступ к нему в другой кодировке, вы должны использовать кодеки:

import codecs
fout = codecs.open('data.txt','w','utf-8')

Ответ 2

Похоже, вы получаете данные Unicode из вашего синтаксического анализатора XML, но вы не кодируете его, прежде чем записывать его. Вы можете явно закодировать результат, прежде чем записывать его в файл:

text = ",".join(stuff) # this will be unicode if any value in stuff is unicode
encoded = text.encode("utf-8") # or use whatever encoding you prefer
fout.write(encoded)