boto3的IO错误download_file

Roh*_*han 5 amazon-s3 python-2.7 boto3 aws-lambda

背景

我正在使用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
Run Code Online (Sandbox Code Playgroud)

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

将其上传到任何文件夹之外时,此代码可以正常工作。

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

[Errno 2]没有这样的文件或目录: /tmp/316bbe85-fa21-463b-b965-9c12b0327f5d/test1/customer1.json.586ea9b8:IOError

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

询问

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

And*_*yko 10

引发错误,因为您试图下载文件并将其保存到不存在的目录中。在下载文件之前使用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
Run Code Online (Sandbox Code Playgroud)

注意:在使用系统路径操作时最好使用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]))
Run Code Online (Sandbox Code Playgroud)

也可能会引发错误,因为您在 s3 存储桶文件的下载路径中包含“/tmp/”,不包含tmp文件夹,因为它可能不存在于 s3 上。通过使用这些文章确保您走在正确的道路上:

  • 好的,但即使在尝试这个之后,同样的错误仍然存​​在。[Errno 2] 没有这样的文件或目录:/tmp/316bbe85-fa21-463b-b965-9c12b0327f5d/test1/customer1.json.586ea9b8: IOError ...... .........................................我打印我的下载路径,它给出了“/ tmp/316bbe85-fa21-463b-b965-9c12b0327f5d”和密钥给出为“test1/customer1.json”,但是在错误中我看到附加了一个额外的“.586ea9b8”......这是否导致了现在的错误......和如果是,我们如何消除它。 (3认同)