9

lxml.etree.iterparse()大きな XML ファイルを反復処理するために使用しています。

入力ファイルの解析がどこまで進んだかを知りたいので、進行状況のインジケーターを取得できます。

私の最初のアイデアos.stat( filename ).st_sizeは、XML ファイルの大きさを知るために を使用することでした。次に、パーサーからイベントを取得するときに、ファイル内の現在の位置を取得します。しかし、どうlxml.etreeすればその内部位置にアクセスできるようになるのかわかりません。iterparse()ファイル名を引数として取っているsourceので、ファイルを開いてそのtell()メソッドを呼び出して、これまでに読み取ったバイト数を知ることはできません。

lxml.etree現在のパーサーの進行状況を示す組み込みインジケーターを認識していますか? それとも、そのような進歩を統合する考えはありますか?

4

2 に答える 2

9

ファイル オブジェクトを に渡してからiterparse、 を呼び出すことができますf.tell()。これにより、ファイル内の要素のおおよその位置がわかります。

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)

のようなものが得られます

(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)
于 2013-06-12T18:06:14.137 に答える