Python 通过迭代输入的每个文件,在内存中创建zip的副本

Python 通过迭代输入的每个文件,在内存中创建zip的副本,python,memory,copy,zip,Python,Memory,Copy,Zip,据我们所知,Python不允许修改归档文件。这就是为什么我想: 打开内存中的压缩包(压缩) 检查zip_-in中的每个文件,如果需要,对其进行更改,然后将其复制到zip_-in。现在,我很高兴能复制一份文件 把拉链拉出来 我在试验zipfile和io,但运气不好。部分原因是我不确定所有这些是如何工作的,以及哪个对象需要哪个输出 工作代码 老例子,有问题 错误是TypeError:“\u io.StringIO”对象不可下标ZipFile.extract()需要文件名,而不是类似文件的对象来写入。

据我们所知,Python不允许修改归档文件。这就是为什么我想:

  • 打开内存中的压缩包(压缩)
  • 检查zip_-in中的每个文件,如果需要,对其进行更改,然后将其复制到zip_-in。现在,我很高兴能复制一份文件
  • 把拉链拉出来
  • 我在试验
    zipfile
    io
    ,但运气不好。部分原因是我不确定所有这些是如何工作的,以及哪个对象需要哪个输出

    工作代码 老例子,有问题
    错误是
    TypeError:“\u io.StringIO”对象不可下标

    ZipFile.extract()
    需要文件名,而不是类似文件的对象来写入。相反,使用
    ZipFile.read(name)
    获取文件的内容。它返回字节字符串,因此可以很好地处理二进制文件。文本文件可能需要解码为unicode。

    谢谢,Matt。结合
    编解码器
    和你的提示,我解决了这个问题。
    import os
    import io
    import codecs
    import zipfile
    
    # Make in-memory copy of a zip file
    # by iterating over each file in zip_in
    # archive.
    #
    # Check if a file is text, and in that case
    # open it with codecs.
    
    zip_in = zipfile.ZipFile(f, mode='a')
    zip_out = zipfile.ZipFile(fn, mode='w')
    for i in zip_in.filelist:
        if os.path.splitext(i.filename)[1] in ('.xml', '.txt'):
            c = zip_in.open(i.filename)
            c = codecs.EncodedFile(c, 'utf-8', 'utf-8').read()
            c = c.decode('utf-8')
        else:
            c = zip_in.read(i.filename)
        zip_out.writestr(i.filename, c)
    zip_out.close()
    
    # Make in-memory copy of a zip file
    # by iterating over each file in zip_in
    # archive.
    #
    # This code below does not work properly.
    
    zip_in = zipfile.ZipFile(f, mode='a')
    zip_out = zipfile.ZipFile(fn, mode='w')
    for i in zip_in.filelist:
        bc = io.StringIO() # what about binary files?
        zip_in.extract(i.filename, bc)
        zip_out.writestr(i.filename, bc.read())
    zip_out.close()