打开一个zip文件,并在zip文件内部流式传输xml文件

时间:2019-01-03 21:49:22

标签: python xml zipfile

我正在尝试打开bulk data from the USPTO。 zip中的xml文件是包含多个xml声明的级联xml文件,并且很大。我试图只从xml中读取行,直到到达下一个xml声明为止。我找到了this相关的问题,没有代码。

我要创建的功能是执行以下操作:

  1. 对于每个* .zip文件
  2. 提取所有xml文件(或打开xml文件进行读取)
  3. 从xml文件读取行
  4. 将每一行附加到下一个xml声明
  5. 返回字符串

到目前为止,我已经能够打开zip文件,找到所有xml文件并提取每个xml文件。我宁愿不将xml文件写入磁盘,而是创建一个字符串,该字符串是我随后进一步解析的单个xml文档。

def main():
path = 'bulk/'
allFiles = glob.glob(path + '*.zip')
allFiles.sort()

for file in allFiles:
    try:
        with zipfile.ZipFile(file, mode = 'r', allowZip64 = True) as fin:
            print(fin, '- ok')
            print(fin.namelist())
            for name in fin.namelist():
                if name.endswith('xml'):
                    print(name) # all files that end in 'xml'
                    fin.extract(name, path='bulk/')
                    print('extracted ', name)
                    # TODO function to read lines of the xml file and




    except zipfile.BadZipFile:
            print(file,'- Bad zip file')

if __name__ == '__main__': main()

1 个答案:

答案 0 :(得分:0)

使用read代替extract。它返回给定名称的zip文件中的字节。重要的是要了解您实际上是将存档提取到内存中,因此请注意实际要提取多少数据以及您在这方面的限制。

例如,以下函数返回一个dict,其中将zip存档文件的名称作为键,并将文件内容作为值:

from zipfile import ZipFile

def extract(f):
    zf = ZipFile(f)
    return {name: zf.read(name) for name in zf.namelist()}