3

以下のようにフォーマットされた大きな xml ファイルから位置と半径のデータを抽出し、そのデータを 2 次元の ndarray に格納する必要があります。Python を使用するのはこれが初めてで、これを行うための最良の方法について何も見つかりません。

<species name="MyHeterotrophEPS" header="family,genealogy,generation,birthday,biomass,inert,capsule,growthRate,volumeRate,locationX,locationY,locationZ,radius,totalRadius">
0,0,0,0.0,0.0,0.0,77.0645361927206,-0.1001871531330136,-0.0013358287084401814,4.523853439106942,234.14575280979898,123.92820420047076,0.0,0.6259920275663835;
0,0,0,0.0,0.0,0.0,108.5705297969604,-0.1411462759900182,-0.001881950346533576,1.0429122163754276,144.1066875513379,72.24884428367467,0.0,0.7017581019907897;
.
.
.
</species>

編集:人間の基準では「大きい」という意味です。メモリの問題はありません。

4

3 に答える 3

4

基本的に、XML テキスト値に CSV データがあります。

を使用ElementTreeして XML を解析し、次に使用numpy.genfromtxt()してそのテキストを配列にロードします。

from xml.etree import ElementTree as ET

tree = ET.parse('yourxmlfilename.xml')
species = tree.find(".//species[@name='MyHeterotrophEPS']")
names = species.attrib['header']
array = numpy.genfromtxt((line.rstrip(';') for line in species.text.splitlines()), 
    delimiter=',', names=names)

str.splitlines()呼び出しを含むジェネレータ式に注意してください。これにより、XML 要素のテキストが一連の行に変換され.genfromtxt()ます。これは非常に喜ばしいことです。;各行から末尾の文字を削除します。

サンプル入力 (.行を除く) の場合、次のようになります。

array([ (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 77.0645361927206, -0.1001871531330136, -0.0013358287084401814, 4.523853439106942, 234.14575280979898, 123.92820420047076, 0.0, 0.6259920275663835),
       (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 108.5705297969604, -0.1411462759900182, -0.001881950346533576, 1.0429122163754276, 144.1066875513379, 72.24884428367467, 0.0, 0.7017581019907897)], 
      dtype=[('family', '<f8'), ('genealogy', '<f8'), ('generation', '<f8'), ('birthday', '<f8'), ('biomass', '<f8'), ('inert', '<f8'), ('capsule', '<f8'), ('growthRate', '<f8'), ('volumeRate', '<f8'), ('locationX', '<f8'), ('locationY', '<f8'), ('locationZ', '<f8'), ('radius', '<f8'), ('totalRadius', '<f8')])
于 2013-06-06T21:17:18.653 に答える
2

XML がそのspeciesノードにすぎない場合、それは非常に単純であり、Martijn Pieters が既に私よりもうまく説明しています。

ただしspecies、ドキュメントに大量のノードがあり、大きすぎて全体をメモリに収められない場合は、iterparse代わりにparse次を使用できます。

import numpy as np
import xml.etree.ElementTree as ET

for event, node in ET.iterparse('species.xml'):
    if node.tag == 'species':
        name = node.attr['name']
        names = node.attr['header']
        csvdata = (line.rstrip(';') for line in node.text.splitlines())
        array = np.genfromtxt(csvdata, delimiter=',', names=names)
        # do something with the array.

species非常に巨大なノードが 1 つしかない場合、iterparse(または SAX パーサーなどの同様のソリューションでも) 一度に 1 つのノード全体を解析するため、これは役に立ちません。大規模なノードのテキストをストリーミングできる XML ライブラリを見つける必要がありますが、私の頭の中で、それを実行できる stdlib や一般的なサードパーティのパーサーは思い浮かびません。

于 2013-06-06T21:21:49.080 に答える