2
file  = BZ2File(SOME_FILE_PATH)
p = xml.parsers.expat.ParserCreate()
p.Parse(file)

bz2 で圧縮された xml ファイルを解析しようとするコードを次に示します。残念ながら、次のメッセージで失敗します。

TypeError: Parse() argument 1 must be string or read-only buffer, not bz2.BZ2File

その場で圧縮された bz2 xml ファイルを解析する方法はありますか?

:p.Parse(file.read())ここではオプションではありません。使用可能なメモリよりも大きいファイルを解析したいので、ストリームが必要です。

4

3 に答える 3

5

p.Parse(file) の代わりに p.ParseFile(file) を使用してください。

Parse() は文字列を受け取り、ParseFile() はファイル ハンドルを受け取り、必要に応じてデータを読み取ります。

参照: http://docs.python.org/library/pyexpat.html#xml.parsers.expat.xmlparser.ParseFile

于 2009-12-03T21:47:38.643 に答える
1

オブジェクトで使用.read()して、fileファイル全体を文字列として読み取り、それをParse?に渡します。

file  = BZ2File(SOME_FILE_PATH)
p = xml.parsers.expat.ParserCreate()
p.Parse(file.read())
于 2009-12-03T21:28:12.117 に答える
0

mmap() されたファイルを渡すことができますか? これにより、ファイルの必要な部分が自動的にページングされ、メモリ オーバーフローが回避されます。もちろんexpat、 が構文木を構築すると、それでもメモリ不足になる可能性があります。

http://docs.python.org/library/mmap.html

メモリ マップト ファイル オブジェクトは、文字列とファイル オブジェクトの両方のように動作します。ただし、通常の文字列オブジェクトとは異なり、これらは変更可能です。文字列が想定されるほとんどの場所で mmap オブジェクトを使用できます。たとえば、re モジュールを使用して、メモリ マップト ファイルを検索できます。

于 2009-12-03T21:42:42.340 に答える