Python 将zip文件OBJ上载到S3-KeyError:存档中没有名为8388608的项

Python 将zip文件OBJ上载到S3-KeyError:存档中没有名为8388608的项,python,amazon-s3,boto3,zipfile,Python,Amazon S3,Boto3,Zipfile,我试图制作一个内存中的zip文件,其中包含一堆JSON文件。我正在努力将它作为文件对象上传到S3,收到了一个相当奇怪的错误。这是我的密码: import boto3 import zipfile import json import os session = boto3.session.Session( aws_access_key_id=os.environ.get('AWS_ACCESS_KEY_ID'), aws_secret_access_key=os.

我试图制作一个内存中的zip文件,其中包含一堆JSON文件。我正在努力将它作为文件对象上传到S3,收到了一个相当奇怪的错误。这是我的密码:

import boto3
import zipfile
import json
import os

session = boto3.session.Session(
        aws_access_key_id=os.environ.get('AWS_ACCESS_KEY_ID'),
        aws_secret_access_key=os.environ.get('AWS_SECRET_ACCESS_KEY'))
client = session.client('s3')

data = {'test1.json': {'a': 1, 'b': 2},
        'test2.json': {'x': 3, 'y': 4}}

zip_buffer = BytesIO()
zf = zipfile.ZipFile(zip_buffer, 'w')
for filename, d in data.iteritems():
    zf.writestr(filename, json.dumps(d, indent=4))

client.upload_fileobj(zf, os.environ.get('S3_BUCKET'), 'test_zip.zip')
这给了我:

KeyError: 'There is no item named 8388608 in the archive'
这是怎么发生的,为什么发生的?当然,档案中没有8388608项——我还没有把它放在那里

编辑


如果我将文件保存在本地而不是内存中,然后重新打开它,它就可以正常工作。我应该使用tempfile吗?

这个问题相当奇怪。首先,需要传递的是zip_缓冲区,而不是zf。但是,您需要确保首先关闭zipfile对象,否则这将导致无法打开损坏的zip文件

import boto3
import zipfile
import json
import os

session = boto3.session.Session(
        aws_access_key_id=os.environ.get('AWS_ACCESS_KEY_ID'),
        aws_secret_access_key=os.environ.get('AWS_SECRET_ACCESS_KEY'))
client = session.client('s3')

data = {'test1.json': {'a': 1, 'b': 2},
        'test2.json': {'x': 3, 'y': 4}}

zip_buffer = BytesIO()
zf = zipfile.ZipFile(zip_buffer, 'w')
for filename, d in data.iteritems():
    zf.writestr(filename, json.dumps(d, indent=4))

zf.close()  # important!
zip_buffer.seek(0)

client.upload_fileobj(zip_buffer, os.environ.get('S3_BUCKET'), 'test_zip.zip')

这是一个相当奇怪的问题。首先,需要传递的是zip_缓冲区,而不是zf。但是,您需要确保首先关闭zipfile对象,否则这将导致无法打开损坏的zip文件

import boto3
import zipfile
import json
import os

session = boto3.session.Session(
        aws_access_key_id=os.environ.get('AWS_ACCESS_KEY_ID'),
        aws_secret_access_key=os.environ.get('AWS_SECRET_ACCESS_KEY'))
client = session.client('s3')

data = {'test1.json': {'a': 1, 'b': 2},
        'test2.json': {'x': 3, 'y': 4}}

zip_buffer = BytesIO()
zf = zipfile.ZipFile(zip_buffer, 'w')
for filename, d in data.iteritems():
    zf.writestr(filename, json.dumps(d, indent=4))

zf.close()  # important!
zip_buffer.seek(0)

client.upload_fileobj(zip_buffer, os.environ.get('S3_BUCKET'), 'test_zip.zip')

内存处理总是令人困惑。看看这个@mootmoot我已经在创建内存中的zip文件了,我认为这可能更多的是boto3问题。这不是boto3问题,你需要传递正确的文件对象,它肯定不是zf,而是缓冲区对象。这就是为什么我说内存处理令人困惑。我发现了发生的事情。我已经尝试过传递zip_缓冲区,它成功了,但它导致无效的zip文件Windows/第三方工具无法打开它们。问题是我在上传之前没有关闭zf。有趣的工件…好吧,你可以发布你的解决方案,事实上,解决方案就在那里。内存处理总是令人困惑。看看这个@mootmoot我已经在创建内存中的zip文件了,我认为这可能更多的是boto3问题。这不是boto3问题,你需要传递正确的文件对象,它肯定不是zf,而是缓冲区对象。这就是为什么我说内存处理令人困惑。我发现了发生的事情。我已经尝试过传递zip_缓冲区,它成功了,但它导致无效的zip文件Windows/第三方工具无法打开它们。问题是我在上传之前没有关闭zf。有趣的工件…好吧,你可以发布你的解决方案,事实上,解决方案就在那里。