2013-06-12 12 views
5

lxml.etree.iterparse()を使用して、大きなXMLファイルを反復処理しています。Pythonでlxmlを使ってXMLを反復する:入力ファイルの読み込み量を知る方法?

入力ファイルの構文解析にどれだけの時間がかかるかを知りたいので、進捗インジケータが表示されることがあります。

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

現在のパーサーの進行状況を示すlxml.etreeビルトインインジケータがありますか?あるいは、あなたはそのような進歩を統合する考えを持っていますか?

答えて

5

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) 
+0

ああ素敵なようなものが得られます!ドキュメンテーションは 'source'引数の型を指定しておらず、例ではファイル名のみを使用しています。 –

関連する問題