0

xml ファイルを utf-8 で解析し、いくつかのフィールドで並べ替えたいと考えています。並べ替えは、カスタム アルファベット (ソースコードの s1) によって行われます。質問の履歴は 次のとおりです。utf-8 文字を含むリストの並べ替えここでxmlをソートする方法を見つけました。ソートは正しく機能します。問題は elementtree にあります。python3 では機能しないことを認めなければなりません

ソースコードは次のとおりです。

#!/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")

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: すると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、2010 年 11 月 28 日、11:28:10)。python2.6 elementtree では問題なく動作します。

tosort.xml の内容:

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

2 に答える 2

1

Looks like you import different modules, one in /usr/lib/python3.1 called xml.etree and the other in /usr/local/lib/python3.1/dist-packages called elementtree. The latter seems broken to me, as for the former, try to remove [:] in the line

 container[:] = [item[-1] for item in data]
于 2012-06-24T09:14:17.517 に答える
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")

解決策は少し醜いですが、うまくいきます... 〜50Mbのxmlデータをソートするのにどれくらいの時間がかかるかわかりませんが、私の場合は時間は重要ではありません. また、単語に数字があるとソートが間違っていたため、ソートパターンを少し変更しました。Acer extensa 5210 では、並べ替えに 2 分もかかりませんでした。

于 2012-06-26T21:26:30.370 に答える