19

如何将内存中的 zipfile 写入文件?

# Create in memory zip and add files
zf = zipfile.ZipFile(StringIO.StringIO(), mode='w',compression=zipfile.ZIP_DEFLATED)
zf.writestr('file1.txt', "hi")
zf.writestr('file2.txt', "hi")

# Need to write it out
f = file("C:/path/my_zip.zip", "w")
f.write(zf)  # what to do here? Also tried f.write(zf.read())

f.close()
zf.close()
4

3 回答 3

37

StringIO.getvalue返回内容StringIO

>>> import StringIO
>>> f = StringIO.StringIO()
>>> f.write('asdf')
>>> f.getvalue()
'asdf'

或者,您可以使用以下命令更改文件的位置seek

>>> f.read()
''
>>> f.seek(0)
>>> f.read()
'asdf'

尝试以下操作:

mf = StringIO.StringIO()
with zipfile.ZipFile(mf, mode='w', compression=zipfile.ZIP_DEFLATED) as zf:
    zf.writestr('file1.txt', "hi")
    zf.writestr('file2.txt', "hi")

with open("C:/path/my_zip.zip", "wb") as f: # use `wb` mode
    f.write(mf.getvalue())

于 2013-08-27T05:33:44.757 回答
15

修改 falsetru 对 python3 的回答

1)使用io.StringIO而不是StringIO.StringIO

python3中的StringIO

2) 使用b"abc"代替"abc", 或

python 3.5:TypeError:写入文件时需要一个类似字节的对象,而不是'str'

3) 编码为二进制字符串str.encode(s, "utf-8")

在 Python 3 中将字符串转换为字节的最佳方法?

import zipfile
import io
mf = io.BytesIO()

with zipfile.ZipFile(mf, mode="w",compression=zipfile.ZIP_DEFLATED) as zf:

    zf.writestr('file1.txt', b"hi")

    zf.writestr('file2.txt', str.encode("hi"))
    zf.writestr('file3.txt', str.encode("hi",'utf-8'))


with open("a.txt.zip", "wb") as f: # use `wb` mode
    f.write(mf.getvalue())

这也适用于 gzip:How do I gzip compress a string in Python?

于 2017-09-14T15:03:02.680 回答
1
  with ZipFile(read_file, 'r') as zipread:
        with ZipFile(file_write_buffer, 'w', ZIP_DEFLATED) as zipwrite:
            for item in zipread.infolist():
                # Copy all ZipInfo attributes for each file since defaults are not preseved
                dest.CRC = item.CRC
                dest.date_time = item.date_time
                dest.create_system = item.create_system
                dest.compress_type = item.compress_type
                dest.external_attr = item.external_attr
                dest.compress_size = item.compress_size
                dest.file_size = item.file_size
                dest.header_offset = item.header_offset

如果 zip 文件读取损坏并且您注意到缺少符号链接或时间戳错误的文件损坏,则可能是文件属性没有被复制。

上面的代码片段是我解决问题的方法。

于 2014-07-19T00:00:01.307 回答