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