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

时间:2018-11-29 22:41:24

标签: python arrays go amazon-s3 zipfile

我正在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]文件名太长”

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

2 个答案:

答案 0 :(得分:1)

读取io.BytesIO,ZipFile类的第一个参数是文件名或文件对象,而不是Zip内容。

如果您想在不创建实际文件的情况下读取内存中的ZipFile,则需要使用Java naming conventions包装file_bytes。

答案 1 :(得分:0)

我想出了办法。在运行中,您将需要对它进行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文件。