解析大型压缩XML文件,Python

2 投票
3 回答
3074 浏览
提问于 2025-04-15 16:40
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() 是用来处理文件的,它会根据需要读取文件里的数据。

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

撰写回答