背景
我使用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