如何将 zip 文件从字节数组写入磁盘

Posted

技术标签:

【中文标题】如何将 zip 文件从字节数组写入磁盘【英文标题】:How to write zip file to disk from byte array 【发布时间】:2018-11-29 22:41:23 【问题描述】:

我在 Go 中从 S3 下载一个 zip 文件,如下所示:

buff := &aws.WriteAtBuffer
downloader := s3manager.NewDownloader(session.New(config))
_, err := downloader.Download(buff, &input)
if err != nil 
    log.Println(err)
    return err


data := buff.Bytes()

我将“数据”发送到用 Python3 编写的客户端,并且需要将此字节数组转换回 zip 文件并将其放在指定的目录中。我试过这个:

file_bytes = msg_obj["Params"]

try:
    zf = zipfile.ZipFile(file_bytes, "r")
    for fileinfo in zf.infolist():
        print(zf.read(fileinfo).decode('ascii'))
except: print("Err:", sys.exc_info()[0])

但我收到此错误:

OSError: [Errno 36] 文件名太长"

我只想“重建”压缩文件并将其保存到目录中。

【问题讨论】:

你是在windows上运行你的python脚本吗?你能提供一个导致错误的文件名示例吗? 【参考方案1】:

读取the documentation,ZipFile类的第一个参数是文件名或文件对象,不是Zip内容。

如果您想在内存中读取 ZipFile 而不创建真实文件,您需要使用 io.BytesIO 包装 file_bytes。

【讨论】:

【参考方案2】:

我想出了如何做到这一点。在 go 中,您需要对其进行 base64 编码(作为字符串)。

buff := &aws.WriteAtBuffer
downloader := s3manager.NewDownloader(session.New(config))
_, err := downloader.Download(buff, &input)
if err != nil 
    log.Println(err)
    return err


data := b64.StdEncoding.EncodeToString(buff.Bytes())

然后在 python 中就这么简单('file_bytes' 是 base64 编码的字符串):

d = base64.b64decode(file_bytes)
f = open('home/update_file', 'wb')
f.write(d)
f.close()

然后 bam,你有一个重新组装的 zip 文件。

【讨论】:

以上是关于如何将 zip 文件从字节数组写入磁盘的主要内容,如果未能解决你的问题,请参考以下文章

将字节数组中的文件写入 zip 文件

在内存中写入具有给定字节数组的ZipEntry

为啥将许多小字节数组写入文件比写入一个大数组要快?

如何将字节数组作为图像文件存储在磁盘上?

h5py 可以从内存中的字节数组加载文件吗?

如何将字节数组写入文件? [复制]