2009-12-03 31 views
2
file = BZ2File(SOME_FILE_PATH) 
p = xml.parsers.expat.ParserCreate() 
p.Parse(file) 

这里的代码试图解析用bz2压缩的xml文件。不幸的是它失败的消息:解析大型压缩的xml文件,python

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

有没有一种方法来分析在运行压缩BZ2 XML文件?

注意p.Parse(file.read())不是这里的一个选项。我想解析一个比可用内存大的文件,所以我需要一个流。

回答

1

使用.read()上的file对象在整个文件中以字符串形式读取,然后将其传递给Parse

file = BZ2File(SOME_FILE_PATH) 
p = xml.parsers.expat.ParserCreate() 
p.Parse(file.read()) 
+0

不错,尝试,但没有。我更新了这个问题,现在有明显的(对我来说,但不适合你),事实上,解析后的文件将是巨大的。 – Marcin 2009-12-03 21:40:53

+0

好吧,随着问题的更新,是的,尼克的答案绝对是正确的。 :) – Amber 2009-12-04 03:54:09

0

你可以传入一个mmap()的ed文件吗?这应该会自动分页所需的文件部分,并避免内存溢出。当然,如果expat建立一个分析树,它可能仍然用完内存。

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

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