2
から親の属性を取得し、私は XMLは:iterparse要素
<data num_entries="1000000000">
<item value="3.1324213213"></item>
<item value="6.2432343213"></item>
<!-- ... -->
</data>
のようなエントリを持つ大規模なXMLファイルを持っている(実際には、複数の
data
のエントリがあると、彼らは、XMLツリー内のより深いですが、のは、それをシンプルに保つみましょう。 )
私はこのファイルをPythonで読んで、すべてitem
をnumpyの配列に入れたいと思います。ファイルは非常に大きいので、ET.parse()
はオプションではありません。メモリをのどに詰まらないようにするには、私は、これは動作しますが、items
が少しずつ割り当てられているので、かなり遅いですelem.clear()
import xml.etree.cElementTree as ET
items = []
for event, elem in ET.iterparse(filename):
if elem.tag == 'item':
items.append(float(elem.attrib['value']))
elem.clear()
items = numpy.array(items)
ように
iterparse()
を使用しています。私は、すなわち、最初の配列を割り当てるために、周囲の
data
ブロックの
num_entries
情報を使用したい
items = None
k = 0
for event, elem in ET.iterparse(filename):
if elem.tag == 'item':
if items is None:
num_entries = get_num_entries_somehow()
items = numpy.empty(num_entries)
items[k] = float(elem.attrib['value'])
k += 1
elem.clear()
のようなものは残念ながら、iterparse
はitem
すべて後のsが反復されている親要素になります以上。
親属性にアクセスする方法iterparse()
?
オプションはありません。ファイルは単純に大きすぎて一度に解析することはできません。私はOPでそれを明らかにした。 –
@NicoSchlömer:それを指摘してくれてありがとう、私の答えを変更してください。 –
ああ、私は今それを得る。 'events =( 'start'、 'end')'なしでは、パーサは最後にのみ解析し、前後でエントリを参照します。ちょうど私が必要なもの。ありがとうございました! –