【问题标题】:parsing large compressed xml files, python解析大型压缩xml文件,python
【发布时间】:2010-12-23 00:22:34
【问题描述】:
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()) 不是这里的选项。我想解析一个大于可用内存的文件,所以我需要一个流。

【问题讨论】:

    标签: python data-compression bzip


    【解决方案1】:

    只需使用 p.ParseFile(file) 而不是 p.Parse(file)。

    Parse() 接受一个字符串,ParseFile() 接受一个文件句柄,并根据需要读取数据。

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

    【讨论】:

      【解决方案2】:

      file 对象上使用.read() 以将整个文件作为字符串读入,然后将其传递给Parse

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

      【讨论】:

      • 不错的尝试,但没有。我更新了这个问题,现在有一个明显的事实(对我来说,但对你来说不是),解析的文件会很大。
      • 好吧,随着问题的更新,是的,尼克的答案绝对是正确的。 :)
      【解决方案3】:

      你能传入一个 mmap()'ed 文件吗?这应该注意自动分页文件的所需部分,并避免内存溢出。当然,如果expat 构建了解析树,它可能仍然会耗尽内存。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 2011-09-01
        相关资源
        最近更新 更多