python-2.7 – boto3 download_file中的IO错误

背景

我使用boto3代码从s3下载文件.这是以下代码.

for record in event['Records']:
    bucket = record['s3']['bucket']['name']
    key = record['s3']['object']['key']
    print (key)
    if key.find('/') < 0 :
    if len(key) > 4 and key[-5:].lower() == '.json': //File is uploaded outside any folder

        download_path = '/tmp/{}{}'.format(uuid.uuid4(), key)
    else:
        download_path = '/tmp/{}/{}'.format(uuid.uuid4(), key)//File is uploaded inside a folder

如果在s3存储桶中上载了新文件,则会触发此代码,并且此代码将下载新上载的文件.

当在任何文件夹之外上传时,此代码工作正常.

但是,当我在目录中上传文件时,会发生IO错误.
这是我遇到的IO错误的转储.

[Errno 2] No such file or directory:
/tmp/316bbe85-fa21-463b-b965-9c12b0327f5d/test1/customer1.json.586ea9b8:
IOError

test1是我的s3存储桶中的目录,其中上传了customer1.json.

询问

有任何想法,如何解决这个错误?

最佳答案 引发错误是因为您试图将文件下载并保存到不存在的目录中.使用
os.mkdir之前的下载文件来创建目录.

# ...
else:
    item_uuid = str(uuid.uuid4())
    os.mkdir('/tmp/{}'.format(item_uuid))
    download_path = '/tmp/{}/{}'.format(item_uuid, key)  # File is uploaded inside a folder

注意:使用系统路径时最好使用os.path.join().所以上面的代码可以重写为:

# ...
else:
    item_uuid = str(uuid.uuid4())
    os.mkdir(os.path.join(['tmp', item_uuid]))
    download_path = os.path.join(['tmp', item_uuid, key]))

也可能因为在s3存储桶文件的下载路径中包含’/ tmp /’而引发错误,不包括tmp文件夹,因为它可能在s3上不存在.使用该文章确保您使用正确的方法:

> Amazon S3 upload and download using Python/Django
> Python s3 examples

点赞