große XML häppchenweise einlesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

große XML häppchenweise einlesen

Beitragvon droptix » Montag 31. März 2008, 12:45

Kann man mit Python eine große XML-Datei häppchenweise einlesen? Ich denke mir sowas:

Code: Alles auswählen

<?xml version="1.0"?>
<root>
   <meta>
      <!-- small data -->
   </meta>
   <info>
      <!-- small data -->
   </info>
   <content>
      <!-- BIG data -->
   </content>
</root>


Ich brauche aus dem XML nur die Elemente <meta> und <info>, nicht aber den Rest. Kann man recht zügig und ohne die gesamte XML-Datei einlesen zu müssen nur die ersten Elemente einlesen?
BlackJack

Beitragvon BlackJack » Montag 31. März 2008, 13:21

Mit einem SAX-Parser nur <meta> und <info> verarbeiten, bzw. `ElementTree.iterparse()` verwenden.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Beitragvon droptix » Montag 31. März 2008, 13:37

Welchen Parser verwendet Python standardmäßig? Ich dachte das wäre Expat... Da ich gern was plattformübergreifendes hätte, klingt die `ElementTree`-Geschichte erstmal gut. Wie löst denn `ElementTree.iterparse()` das Problem? Wird nicht trotzdem erstmal die gesamte Datei eingelesen?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 31. März 2008, 17:12

droptix hat geschrieben:Welchen Parser verwendet Python standardmäßig? Ich dachte das wäre Expat... Da ich gern was plattformübergreifendes hätte

Und Expat ist etwa nicht platformunabhängig? Wenn du SAX nutzt, kann dir der Parser mehr oder weniger egal sein, SAX ist sowieso überall gleich (unangenehm).
My god, it's full of CARs! | Leonidasvoice vs Modvoice
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Beitragvon droptix » Dienstag 1. April 2008, 10:09

Leonidas hat geschrieben:Und Expat ist etwa nicht platformunabhängig? Wenn du SAX nutzt, kann dir der Parser mehr oder weniger egal sein, SAX ist sowieso überall gleich (unangenehm).


Klar ist Expat plattformabhängig, aber ich dachte in Python "eingebaut". Hab das so verstanden, dass Python für SAX nur eine Schnittstelle bietet. Aber ich gebe zu, dass es etwas unübersichtlich ist…

Wer weiß mehr? Kommen Expat bzw. SAX mit Python mit?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Dienstag 1. April 2008, 10:31

Schau in die Doku. python.org/doc
Da steht das alles, wirklich!
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Beitragvon droptix » Dienstag 1. April 2008, 10:53

xml.parsers.expat hat geschrieben:The xml.parsers.expat module is a Python interface to the Expat non-validating XML parser. […] This module uses the pyexpat module to provide access to the Expat parser.


D.h. das pyexpat Modul muss separat installiert werden (es wird nicht im Global Module Index aufgelistet)?

xml.sax hat geschrieben:The xml.sax package provides a number of modules which implement the Simple API for XML (SAX) interface for Python. The package itself provides the SAX exceptions and the convenience functions which will be most used by users of the SAX API.


SAX kenne ich nur in Verbindung mit fertigen SAX-Parsern. Frage: liefert Python einen mit? Oder ist das xml.sax Modul bereits alles, was ich benötige?
BlackJack

Beitragvon BlackJack » Dienstag 1. April 2008, 12:11

Ja Python liefert einen SAX-Parser.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Beitragvon droptix » Dienstag 1. April 2008, 14:19

Von Haus aus für jede Plattform oder muss da ein Extra-Modul installiert werden?

Mit TkInter ist das ja ähnlich: unter Windows ist das von Haus aus dabei, unter Linux muss das aber u.U. erst nachinstalliert werden, aber es gehört wenigstens zur Standard-Distribution. Daher meine Unsicherheit...
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 1. April 2008, 14:30

droptix hat geschrieben:
Leonidas hat geschrieben:Und Expat ist etwa nicht platformunabhängig? Wenn du SAX nutzt, kann dir der Parser mehr oder weniger egal sein, SAX ist sowieso überall gleich (unangenehm).


Klar ist Expat plattformabhängig, aber ich dachte in Python "eingebaut". Hab das so verstanden, dass Python für SAX nur eine Schnittstelle bietet. Aber ich gebe zu, dass es etwas unübersichtlich ist…

Ist es doch. Alles was im Global Module Index dukumentiert ist, ist in der Stdlib. Ich sehe dein Problem nicht.

Expat kannst du zwar direkt nutzen, aber du kannst genauso gut auch die "höheren" APIs SAX und Minidom oder ElementTree verwenden (ich würde ja zu ET, aber mindestens zu DOM raten, weil SAX echt PITA ist). Wenn es schnell gehen soll, dann ist sowieso lxml die erste Wahl, wie der aktuelle Geschwindigkeitsvergleich von Ian Bicking zeigte.

Und wie das Python-Paket auf Linux aufgeteilt wird, ist nicht definiert. Die Distributionen können das Paket splitten wie sie wollen, sie können auch Teile (etwa den Profiler) weglassen. Aber es macht keinen sinn, wegen solchen Überlegungen auf einen Parser in der Stdlib zu verzichten. Unter Windows kann ich auch entscheiden Tkinter nicht zu installieren, also ist es nicht von Haus aus dabei.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Beitragvon BlackJack » Dienstag 1. April 2008, 17:40

@Leonidas: Das XML soll nicht ganz verarbeitet werden, sondern nur ein verhältnismässig kleiner Teil am Anfang. Damit fällt DOM im Grunde raus.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 1. April 2008, 18:31

BlackJack hat geschrieben:@Leonidas: Das XML soll nicht ganz verarbeitet werden, sondern nur ein verhältnismässig kleiner Teil am Anfang. Damit fällt DOM im Grunde raus.

Hmm, wieso? Solange das XML-Dokument nicht zu groß ist, kann man es doch problemlos einlesen. Wenn es tatsächlich zu langsam wird, kann man sich immer noch was überlegen. Es ist schon möglich, dass hier ein Fall von Premature Optimization vorliegt. Ist DOM tatsächlich ein Performance-Problem oder nur ein geschätztes Problem?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Beitragvon BlackJack » Dienstag 1. April 2008, 19:49

Ich bin halt davon ausgegangen, dass der Kommentar in Zeile 10 im ersten Beitrag ernst gemeint war.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 1. April 2008, 20:02

BlackJack hat geschrieben:Ich bin halt davon ausgegangen, dass der Kommentar in Zeile 10 im ersten Beitrag ernst gemeint war.

BIG data kann ja alles mögliche meinen. Es kann ja immer noch klein genug sein, so dass man es mit dem kompletten Parsen angehen kann. Sowas muss man eben ausprobieren. Bevor ich zu SAX greifen würde, tät ich wirklich erst nachsehen ob es wirklich ein ausreichend großes Problem ist.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Beitragvon droptix » Dienstag 1. April 2008, 21:50

Na, gehen wir mal davon aus, dass in <!-- BIG data --> wirklich zu große Daten stehen, also nehmen wir ruhig 10.000 bis 50.000 Zeilen an.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder