如何将 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 文件从字节数组写入磁盘的主要内容,如果未能解决你的问题,请参考以下文章