2012-06-21 1 views
0

Я хочу проанализировать xml-файл в utf-8 и отсортировать его по некоторому полю. Soring выполняется с помощью пользовательского алфавита (s1 от исходного кода). История вопроса находится здесь: sorting of list containing utf-8 charachters. Я нашел способ сортировки xml here. Сортировка работу правильно, проблема с ElementTree, я должен признать, что он не работает на Python3parse xml с elementtree, пользовательская сортировка

Вот исходный код:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
#import xml.etree.ElementTree as ET # Python 2.5 
import elementtree.ElementTree as ET 
s1='aáàAâÂbBcCçÇdDeéEfFgGğĞhHiİîÎíīıIjJkKlLmMnNóoOöÖpPqQrRsSşŞtTuUûúÛüÜvVwWxXyYzZ' 
s2='11111122334455666aabbccddeeeeeeffgghhiijjkklllllmmnnooppqqrrsssssttuuvvwwxxyy' 
trans = str.maketrans(s1, s2) 
def unikey(seq): 
    return seq[0].translate(trans) 
tree = ET.parse("tosort.xml") 
container = tree.find("entries") 
data = [] 
for elem in container: 
    keyd = elem.findtext("k") 
    data.append((keyd, elem)) 
print (data) 
data.sort(key=unikey) 
print (data) 
container[:] = [item[-1] for item in data] 
tree.write("sorted.xml", encoding="utf-8") 

Вот instructions импортировать модуль ElementTree. Когда я импортировать модуль таким образом: import xml.etree.ElementTree as ET, я получаю сообщение:

Traceback (most recent call last): 
File "pcs.py", line 19, in <module> 
container[:] = [item[-1] for item in data] 
File "/usr/lib/python3.1/xml/etree/ElementTree.py", line 210, in __setitem__ 
assert iselement(element) 
AssertionError 

Когда я использую этот метод для импорта: import elementtree.ElementTree as ET, я получаю это сообщение:

Traceback (most recent call last): 
File "pcs.py", line 4, in <module> 
import elementtree.ElementTree as ET 
File "/usr/local/lib/python3.1/dist-packages/elementtree/ElementTree.py", line 794, in <module> 
_escape = re.compile(eval(r'u"[&<>\"\u0080-\uffff]+"')) 
File "<string>", line 1 
u"[&<>\"\u0080-\uffff]+" 
        ^
SyntaxError: invalid syntax 

Я использую Python 3.1.3 (r313: 86834, 28.11.2010, 11:28:10). В python2.6 elementtree работает без проблем.

Содержание tosort.xml:

<xdxf> 
<entries> 
<ar><k>zaaaa</k>definition1</ar> 
<ar><k>şaaaa</k>definition2</ar> 
... 
... 
</entries> 
</xdxf> 
+0

В первом блоке кода есть проблемы с отступом внутри 'for', вы можете исправить это, чтобы соответствовать фактическому запущенному вами коду? –

+0

Кроме того, я думаю, что проблема может заключаться в том, что 's2' по-прежнему содержит символы, отличные от ASCII, и это испортит сортировку. –

+0

О, извините. Я исправил это. второй код с символами, отличными от ASCII, работает хорошо. Я думаю, что что-то не так с кодировкой inout, но я не могу понять. – microspace

ответ

1

Похоже, вы импортировать различные модули, один в /usr/lib/python3.1 называется xml.etree, а другой в /usr/local/lib/python3.1/dist-packages называется elementtree. Последнее, кажется, сломана мне, как для первых, попытайтесь удалить [:] в строке

container[:] = [item[-1] for item in data] 
+0

удаление '[:]' не помогло. Эта строка кода из [примера] (http://effbot.org/zone/element-sort.htm). Модуль 'AssertionError', похоже, работает на python2.6. Может кто-то может сказать, как сделать мой перевод строк в python 2.6? Спасибо! – microspace

+0

@microspace Если это не помогло, можете ли вы показать, как выглядит трассировка без '[:]'? –

+0

Я отредактировал вопрос. Я выполнил трассировку следующей командой 'print (traceback.format_exc())'. Правильно ли это? Я никогда не печатал трассировку раньше ... Без '[:]' отсортированные данные просто не были записаны в файл ... – microspace

0

Не пробивать меня слишком много, но, вот мой вариант решения:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import xml.etree.ElementTree as ET # Python 2.5 
from xml.etree.ElementTree import Element 
s1="áàaAâÂbBcCçÇdDeéEfFgGğĞhHiİîÎíīıIjJkKlLmMnNóoOöÖpPqQrRsSşŞtTuUûúÛüÜvVwWxXyYzZ" 
s2="AAAAAABBCCCCDDEEEFFGGHHddeeeeeeffgghhiijjkklllllmmnnooppqqrrsssssttuuvvwwxxyy" 
trans = str.maketrans(s1, s2) 
def unikey(seq): 
    return seq[0].translate(trans) 
tree = ET.parse("tosort.xml") 
container = tree.find("entries") 
data = [] 
for elem in container: 
    keyd = elem.findtext("k") 
    data.append([keyd, elem]) 
data.sort(key=unikey) 
root = tree.getroot() 
i=0 
for item in data: 
    root.append(data[i][1]) # appends sorted Element objects to tree 
    i=i+1 
#container = [item[-1] for item in data] 
root.remove(tree.find("entries")) # removes unsorted Element objects 
tree.write("sorted.xml", encoding="utf-8") 

Решение немного уродлив, но он работает ... Я не знаю, сколько времени потребуется для сортировки ~ 50 Мб данных xml, но время в моем случае не имеет значения. Кроме того, я немного изменил шаблон сортировки, потому что он неправильно отсортировался, если бы были цифры в словах. На Acer extensa 5210 для сортировки потребовалось не более 2 минут.

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

  • Нет связанных вопросов^_^