解析大型压缩XML文件,Python
file = BZ2File(SOME_FILE_PATH)
p = xml.parsers.expat.ParserCreate()
p.Parse(file)
这里有一段代码,试图解析一个用bz2压缩的xml文件。可惜的是,它失败了,并给出了这样的错误信息:
TypeError: Parse() 的第一个参数必须是字符串或只读缓冲区,而不是 bz2.BZ2File
有没有办法实时解析压缩的bz2 xml文件呢?
注意:p.Parse(file.read())
在这里不可行。我想解析一个比可用内存还大的文件,所以我需要使用流的方式。
3 个回答
0
你能传入一个用mmap()处理过的文件吗?这样可以自动加载文件中需要的部分,避免内存溢出。当然,如果expat
构建了一个解析树,它可能还是会耗尽内存。
http://docs.python.org/library/mmap.html
内存映射文件对象既像字符串,也像文件对象。不过,与普通字符串对象不同的是,这些对象是可变的。你可以在大多数需要字符串的地方使用mmap对象;例如,你可以使用re模块在内存映射文件中进行搜索。
1
使用 .read()
方法在 file
对象上,可以把整个文件的内容读进来,作为一个字符串,然后把这个字符串传给 Parse
吗?
file = BZ2File(SOME_FILE_PATH)
p = xml.parsers.expat.ParserCreate()
p.Parse(file.read())
5
直接用 p.ParseFile(file) 来代替 p.Parse(file) 就可以了。
Parse() 是用来处理字符串的,而 ParseFile() 是用来处理文件的,它会根据需要读取文件里的数据。