1
大きなOpenStreetMap(OSM)XMLファイルを解析するために、ElementTreeの関数iterparse
を使用しようとしています。 OSMファイルとその要素を後の分析に役立つクラスオブジェクトとして定義しようとしています。Pythonで別のクラスオブジェクトの関数を使って1つのクラスオブジェクトのインスタンスを作成するには?
parse()
は、OSMファイルをiterparseする発電機を使用しています。は今、私は正常
OSM
クラスを定義しました。elem
(OpenStreetMapの要素)が生成されます。reset()
枯渇を避けるために発電機をリセットします。slice()
は、start、stop、stepのインデックスを渡してitertoolsを使用してOSMファイルのビューを作成します。elem
のリストを返します。iloc()
は、特定のelem
を見つけるスライス機能と呼ばれます。getchild()
は、特定のインデックスを持つ要素の2次要素を返します。
私の問題は、次のとおりです。私は、単一の要素に関数を作成するために、別のクラスelem
を作りたい。しかし、私はOSM
の関数を呼び出すことによってelem
のインスタンスを生成する必要があります。 つまり、クラス1です。 クラス1のインスタンスの関数を呼び出すときは、クラス2のインスタンスを作成して返します。
どうすればこの問題を解決できますか?
import xml.etree.cElementTree as ET
from collections import defaultdict
import itertools
class OSM:
def __init__(self, data):
self.data = data
self.parser = ET.iterparse(self.data, events=('start',))
def parse(self):
_, root = next(self.parser)
for event, elem in self.parser:
yield elem
elem.clear()
root.clear()
def reset(self):
self.parser = ET.iterparse(self.data, events=('start',))
def slice(self, start=0, stop=1, step=1):
self.reset()
view = []
for i in itertools.islice(self.parse(), start, stop, step):
view.append(i)
return view
def iloc(self, index):
self.reset()
return self.slice(index, index + 1)[0]
def getchild(self, index):
self.reset()
elem = self.iloc(index)
childdict = defaultdict(list)
for i, child in enumerate(list(elem)):
childdict[i] = [child.tag, child.attrib]
return dict(childdict)
あなたはそれをあなたのコード内の他の場所で他のクラスをインスタンス化と同じように行う
は、ここに私の現在のコードです。 – kindall