使用 python 将二进制数据写入 zip 文件

Posted

技术标签:

【中文标题】使用 python 将二进制数据写入 zip 文件【英文标题】:Write Binary data with python to a zip file 【发布时间】:2016-01-04 20:43:10 【问题描述】:

我想将二进制数据写入 zip 文件。

以下内容有效,但如果我尝试添加 .zip 作为文件扩展名以在变量 x 中“检查”,则不会将任何内容写入文件。我被卡住手动添加.zip

urla = "some url"
tok = "some token"
pp = "token": tok
t = requests.get(urla, params=pp)
b = t.content
x = r"C:\temp" + "\check"
z = 'C:\temp\checks.zip'
with open(x, "wb") as work:
     work.write(b)

为了将正确的扩展名附加到文件中,我尝试使用模块ZipFile

with ZipFile(x, "wb") as work:
    work.write(b)

但是得到一个RuntimeError:

RuntimeError: ZipFile() requires mode "r", "w", or "a"

如果我删除 b 标志,则会创建一个空的 zipfile,我会得到一个 TypeError

TypeError: must be encoded string without NULL bytes, not str

我也尝试过,但它会创建一个损坏的 zip 文件。

os.rename(x, z ) 

如何将二进制数据写入 zip 文件。

【问题讨论】:

@njzk2 r = 'raw',不是正则表达式,所以他不必转义文件名中的反斜杠。 你可以给文件任何你喜欢的扩展名。 @Peter Wood 这就是问题... @BobDylan 好点。我不知道这里发生了什么。但是+ "\check" 也应该工作吗? @njzk2 该字符串正在转义c,但这在python中没有任何意义,因此它只会添加另一个反斜杠。 【参考方案1】:

您不会将数据直接写入 zip 文件。您将其写入文件,然后将 文件路径 写入 zip 文件。

binary_file_path = '/path/to/binary/file.ext'
with open(binary_file_path, 'wb') as f:
    f.write('BINARYDATA')

zip_file_path = '/path/to/zip/file.zip'
with ZipFile(zip_file_path, 'w') as zip_file:
    zip_file.write(binary_file_path)

【讨论】:

或者,你可以使用writestr 这也不起作用。这会创建一个file.ext 并将其压缩。变量b 是一个压缩文件,这就是为什么当手动更改文件名时我可以提取它。 @Dan 我以为b 是二进制数据?你是说b 是 zip 数据? @Dan 我还是很困惑。请求返回的是您想要写入 zip 文件的二进制数据(不是 zip 文件),还是实际上是您想要读取的 zip 文件数据? 它是一个 zip,但如果我这样做 open(x, "w") it creates a corrupted zip` 由于某种原因必须包含 binary 标志【参考方案2】:

我将一个 zip 文件转换为二进制数据,并能够通过以下方式重新生成该 zip 文件:

bin_data=b"\x0\x12" #Whatever binary data you have store in a variable
binary_file_path = 'file.zip' #Name for new zip file you want to regenerate
with open(binary_file_path, 'wb') as f:
    f.write(bin_data)

【讨论】:

【参考方案3】:

使用writestr 方法。

import zipfile
z = zipfile.ZipFile(path, 'w')
z.writestr(filename, bytes)
z.close()

zipfile.ZipFile.writestr

【讨论】:

以上是关于使用 python 将二进制数据写入 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

从 URL 下载返回的 Zip 文件

在 Python 中将二进制数据写入文件

Python,在内存中写入 zip 到文件

如何在 Python 中将文件写入 Zip 文件的根目录

怎么将内存buffer二进制数据直接写入/dev/mtd2

当列表包含某些内容时,为啥使用 zip() 只写入 CSV 文件?