2013-06-12 8 views
5

Używam lxml.etree.iterparse() do iteracji poprzez duży plik XML.Iterowanie XML z lxml w Pythonie: jak sprawdzić, ile danych wejściowych zostało przeczytanych?

Chciałbym wiedzieć, jak daleko zajmuję parsowanie pliku wejściowego, aby uzyskać wskaźnik postępu.

Moim pierwszym pomysłem było użycie os.stat(filename).st_size, aby wiedzieć, jak duży jest mój plik XML, a następnie, gdy otrzymuję zdarzenia z parsera, pobierz aktualną pozycję w pliku. Ale nie mogę zrozumieć, w jaki sposób lxml.etree może dać mi dostęp do swojej wewnętrznej pozycji. iterparse() przyjmuje nazwę pliku jako jego argument source, więc nie mogę otworzyć pliku i wywołać jego metodę tell(), aby dowiedzieć się, ile bajtów zostało przeczytanych do tej pory.

Czy znasz dowolny wbudowany wskaźnik lxml.etree dla bieżącego postępu analizatora składni? A może masz pomysł na integrację takiego rozwoju?

Odpowiedz

5

Możesz przekazać obiekt pliku do iterparse, a następnie zadzwonić pod numer f.tell(). Da ci to przybliżoną pozycję elementu w pliku.

import lxml.etree as ET 
import os 

filename = 'data.xml' 
total_size = os.path.getsize(filename) 
with open(filename, 'r') as f: 
    context = ET.iterparse(f, events=('end',), tag='Record') 
    for event, elem in context: 
     print(event, elem, float(f.tell())/total_size) 

przyniesie coś

(u'end', <Element Record at 0xb743e2d4>, 0.09652665470688218) 
(u'end', <Element Record at 0xb743e2fc>, 0.09652665470688218) 
(u'end', <Element Record at 0xb743e324>, 0.09652665470688218) 
... 
(u'end', <Element Record at 0xb744739c>, 1.0) 
(u'end', <Element Record at 0xb74473c4>, 1.0) 
(u'end', <Element Record at 0xb74473ec>, 1.0) 
+0

Oh Nice! Dokumentacja nie określa typu argumentu "source", a przykłady wykorzystują tylko nazwę pliku. –

Powiązane problemy