1
我正在嘗試使用ElementTree的iterparse
功能來解析一個大的OpenStreetMap(OSM)XML文件。我試圖將我的OSM文件及其元素定義爲類對象,以幫助我進行後續分析。如何使用Python中的另一個類對象的功能創建一個類對象的實例?
現在,我已經成功地定義一個OSM
類:
parse()
使用發電機來iterparse OSM的文件。它產生elem
(OpenStreetMap中的元素)。reset()
重置發生器以避免耗盡。slice()
使用itertools通過傳遞start,stop和step的索引來創建OSM文件的視圖。它返回一個elem
的列表。iloc()
調用切片功能來定位特定的elem
。getchild()
返回具有給定索引的元素的次要元素。
我的問題是:我不想再拍類elem
到一個單一的元素上創建功能。但是,我只能通過調用OSM
的函數來生成elem
的實例。即我有class1。當我調用class1的實例的函數時,它應該創建並返回一個class2的實例。
我該如何實現這一目標?
這裏是我當前的代碼:
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