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())
不是此处的选项。我想解析一个比可用内存大的文件,所以我需要一个流。
答案 0 :(得分:5)
只需使用p.ParseFile(文件)而不是p.Parse(文件)。
Parse()接受一个字符串,ParseFile()接受一个文件句柄,并根据需要读取数据。
参考:http://docs.python.org/library/pyexpat.html#xml.parsers.expat.xmlparser.ParseFile
答案 1 :(得分:1)
使用file
对象上的.read()
将整个文件作为字符串读取,然后将其传递给Parse
?
file = BZ2File(SOME_FILE_PATH)
p = xml.parsers.expat.ParserCreate()
p.Parse(file.read())
答案 2 :(得分:0)
你能传入一个mmap()'ed文件吗?这应该注意自动分页文件的所需部分,并避免内存溢出。当然,如果expat
构建了一个解析树,它可能仍会耗尽内存。
http://docs.python.org/library/mmap.html
内存映射文件对象的行为类似于字符串和文件对象。然而,与普通的字符串对象不同,这些是可变的。您可以在大多数需要字符串的地方使用mmap对象;例如,您可以使用re模块搜索内存映射文件。