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 上。通过使用这些文章确保您走在正确的道路上:
| 归档时间: |
|
| 查看次数: |
6618 次 |
| 最近记录: |