当前位置: 首页 > 知识库问答 >
问题:

Python,在内存中写入zip文件

苏宏峻
2023-03-14

如何将内存中的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()

共有3个答案

金晨
2023-03-14
  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文件读取损坏的情况下,您注意到缺少符号链接或带有错误时间戳的损坏文件,这可能是文件属性没有被复制过来的事实。

上面的代码片段就是我如何解决这个问题的。

骆照
2023-03-14

修改falsetru对python3的回答

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

蟒蛇中的StringIO 3

2) 使用b“abc”代替“abc”,或

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

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

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

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:如何在Python中压缩字符串?

谢鸿飞
2023-03-14

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())
 类似资料:
  • 问题内容: 是否有一个Python库,可以在不使用实际磁盘文件的情况下操纵内存中的zip存档? ZipFile库不允许您更新存档。唯一的方法似乎是将其提取到目录中,进行更改,然后从该目录中创建新的zip。我想修改没有磁盘访问权限的zip归档文件,因为我将下载它们,进行更改并再次上传它们,因此没有理由存储它们。 尽管几乎没有任何接口可以避免磁盘访问,但类似于Java的ZipInputStream /

  • 我想写一个字节向量,

  • 下面是通过FileBrowser将文件添加到目录的事件的问题。加载单个文件会产生一堆事件: 我认为消息的数量取决于上传zip文件的时间。我不知道如何用watchdog来解决它,下面是代码:

  • 问题内容: 我正在下载包含XML的压缩文件,由于延迟要求,我希望避免在操作之前将zip文件写入磁盘。但是,这不足以满足我的需求。没有办法说“这是一个zip文件的字节数组,请使用它”而不将其转换为流,并且它不可靠,因为它会扫描条目标头(请参阅EDIT下面的讨论,以了解为什么它不可靠)。 我尚无法访问要处理的zip文件,因此我不知道我是否能够通过来处理它们,因此我需要找到一种适用于任何有效ZIP文件的

  • 问题内容: 如何解压缩到内存? 我尝试(返回上): 问题答案: 提取到文件系统,因此您将无法获得所需的内容。若要提取内存中的文件,请使用方法。 如果您确实需要内存中的全部内容,则可以执行以下操作:

  • 问题内容: 我有这样的熊猫DataFrame 我想将此数据写入如下所示的文本文件: 我已经尝试过类似的东西 但它不起作用。这该怎么做? 问题答案: 您可以只使用和访问np属性: 产量: 或: 请注意,您必须传递通过追加模式创建的文件句柄。