1

大きな xmlファイルを解析し、タグを出力ファイルに出力しようとしています。私はminidomを使用しています。私のコードは 30Mb のファイルでは問題なく動作しますが、より大きなファイルではメモリ エラーが発生します。そのため、ファイルの読み取りに bufferred を使用しましたが、目的の出力を取得できません。

XML ファイル

> <File> <TV>Sony</TV> <FOOD>Burger</FOOD> <PHONE>Apple</PHONE> </File>   
> <File> <TV>Samsung</TV> <FOOD>Pizza</FOOD> <PHONE>HTC</PHONE> </File>  
> <File> <TV>Bravia</TV> <FOOD>Pasta</FOOD> <PHONE>BlackBerry</PHONE> </File>  

望ましい出力

ソニー、バーガー、アップル
サムスン、ピザ、HTC
ブラビア、パスタ、ブラックベリー

バッファで読み取ると、次のような出力が表示されます: -Sony
、Burger、Apple
Samsung、Piz Bravia、Pasta、BlackBerry

while 1:
    content = File.read(2048)
        if not len(content):
            break
         else:
             for lines in StringIO(content):
                lines = lines.lstrip(' ')
                if lines.startswith("<TV>"):
                   TV =  lines.strip("<TV>")
                   tvVal = TV.split("</TV>")[0]
                   #print tvVal
                   w2.writelines(str(tvVal)+",")
                elif lines.startswith("<FOOD>"):
                   FOOD =  lines.strip("<FOOD>")
                   foodVal = FOOD.split("</FOOD>")[0]
                   #print foodVal
                   w2.writelines(str(foodVal)+",")
                   ............................
                   ...........................

seek()を試しましたが、それでも目的の出力を取得できませんでした。

4

2 に答える 2

1

一度に 2048 バイトを読み取っているため、読み取りカーソルが行の途中に置かれています。次の読み取りでは、タグで始まらないため、その行の残りは破棄されます。

独自のパーサーをローリングする代わりに、 の使用を検討してくださいiterparse。のさらに高速なバージョンiterparseが含まれておりlxml 、例を示します

import cStringIO
from xml.etree.ElementTree import iterparse

fakefile = cStringIO.StringIO("""<temp>
  <email id="1" Body="abc"/>
  <email id="2" Body="fre"/>
  <email id="998349883487454359203" Body="hi"/>
</temp>
""")
for _, elem in iterparse(fakefile):
    if elem.tag == 'email':
        print elem.attrib['id'], elem.attrib['Body']
    elem.clear()
于 2013-03-29T09:26:54.630 に答える