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.ParseFile(file) 而不是 p.Parse(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()'ed 文件吗?这应该注意自动分页文件的所需部分,并避免内存溢出。当然,如果expat构建一个解析树,它可能仍然会耗尽内存。

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

内存映射文件对象的行为既像字符串,又像文件对象。然而,与普通字符串对象不同的是,它们是可变的。您可以在大多数需要字符串的地方使用 mmap 对象;例如,您可以使用 re 模块搜索内存映射文件。

于 2009-12-03T21:42:42.340 回答