Найти - Пользователи
Полная версия: xml tree.write и utf-8
Начало » Python для новичков » xml tree.write и utf-8
1
gelo
Привет,

кто поможет разобраться с записью не латинских знаков при записи через tree.write(xmlfile)

Сначала беру текст из csv файла и занопу в tuple:
try:
	with open(sys.argv[1],"r" ) as csvfile:
		emails = csv.reader(csvfile, delimiter=b';')
		for row in emails:
			pn_tuple.append(row)
except IOError as e:
	print(e.errno, e.strerror)
	print("Cannot open file",sys.argv[1])

потом создаю необходимое дерево xml и вкладываю некоторые поля из тапла
root = ET.Element("log")
root.set("action","add")
pn = len(pn_tuple)
for i in range(len(pn_tuple)):	
	xtag_mailbox = ET.SubElement(root,"mailbox")
	xtag_login = ET.SubElement(xtag_mailbox,"login")
	xtag_login.text = pn_tuple[i][0]
	xtag_fname = ET.SubElement(xtag_mailbox, "firstname")
	xtag_fname.text = pn_tuple[i][3]
и пытаюсь записать в файл

tree = ET.ElementTree(root)
with open("file.xml", "w+", encoding='utf-8') as file:
	tree.write(file, xml_declaration=True, encoding='utf-8')

в конце вылетает ошибка:
Traceback (most recent call last):
  File "./mail.py", line 133, in <module>
    tree.write(file, xml_declaration=True, encoding='utf8')
  File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 820, in write
    serialize(write, self._root, encoding, qnames, namespaces)
  File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 939, in _serialize_xml
    _serialize_xml(write, e, encoding, qnames, None)
  File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 939, in _serialize_xml
    _serialize_xml(write, e, encoding, qnames, None)
  File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 937, in _serialize_xml
    write(_escape_cdata(text, encoding))
  File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 1073, in _escape_cdata
    return text.encode(encoding, "xmlcharrefreplace")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 4: ordinal not in range(128)

Данные в тапле выглядат следующим образом:
'Lenka', 'Do\xc4\x8dkalov\xc3\xa1'

подскажите как мне записать такие вот знаки через tree.write

спасибо



doza_and
Желательно в пока данные находятся в памяти везде использовать unicode
Поэтому может быть ваше:
with open(sys.argv[1],"r" ) as csvfile:
надо заменить на открывание файла с указанием кодировки.
например для 2.x
import codecs
with codecs.open(sys.argv[1],"r",'utf-8') as csvfile:
или для 3.x
with open(sys.argv[1],"r",'utf-8') as csvfile:
Кодировку укажите сами. По вашим данным не очень понятно какая кодировка в исходном файле.
p.s.
xml плохой формат, если есть возможность используйте другое представление.
py.user.next
doza_and
или для 3.x
with open(sys.argv[1],"r",'utf-8') as csvfile:
третьим аргументом идёт буферизация
doza_and
py.user.next
третьим аргументом идёт буферизация
мда сказывается привычка я всегда явно указываю, а сейчас не указал по лени…
http://docs.python.org/3.1/library/functions.html#open
Надо было поправить, а то как человек это будет использовать.
with open(sys.argv[1], "r", encoding='utf-8') as csvfile:
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB