【问题标题】:How to write zip file to disk from byte array如何将 zip 文件从字节数组写入磁盘
【发布时间】: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脚本吗?你能提供一个导致错误的文件名示例吗?

标签: python arrays go amazon-s3 zipfile


【解决方案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 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      相关资源
      最近更新 更多