J'essaie d'utiliser la fonction iterparse
de ElementTree pour analyser un grand fichier XML OpenStreetMap (OSM). J'essaie de définir mon fichier OSM et ses éléments en tant qu'objets de classe pour faciliter mon analyse ultérieure.Comment créer une instance d'un objet de classe avec la fonction d'un autre objet de classe en Python?
Maintenant, j'ai défini avec succès une classe OSM
:
parse()
utilise un générateur pour iterparse le fichier OSM. Il donneelem
(éléments dans OpenStreetMap).reset()
réinitialiser le générateur pour éviter l'épuisement.slice()
utilise itertools pour faire des vues du fichier OSM en passant l'index de start, stop et step. Il renvoie une liste deelem
.iloc()
appelé la fonction tranche pour localiser unelem
spécifique.getchild()
renvoie l'élément secondaire d'un élément avec un index donné.
Mon problème est: Je veux faire une autre classe elem
pour créer des fonctions sur un seul élément. Cependant, je dois seulement générer une instance de elem
en appelant une fonction de OSM
. , c'est-à-dire que j'ai class1. Et quand j'appelle une fonction d'une instance de class1, il doit créer et renvoyer une instance de class2.
Comment puis-je obtenir ceci?
Voici mon code actuel:
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)
Vous le faites de la même façon que vous instancier toute autre classe à tout autre endroit dans votre code. – kindall