[英]Download S3 File Using Boto3
我当前正在编写一个脚本,在该脚本中,我需要将S3文件下载到创建的目录中。 我目前使用凭证创建一个boto3会话,从该会话创建一个boto3资源,然后使用它从我的s3位置进行查询和下载。 看起来像下面的示例:
s3_session = boto3.Session(...)
s3_resource = s3_session.resource('s3')
mnt_loc = '/home/username/tmp/'
s3_loc = urlparse('s3://bucket_name/path1/path2/', allow_fragments=False)
s3_files = []
bucket = s3_resource.Bucket(s3_loc.netloc)
for elem in bucket.objects:
s3_files.append(elem)
for elem in s3_files:
s3_resource.Bucket(elem.bucket_name).download_file(elem.key, mnt_loc + elem.key.rsplit('/', 1)[-1])
从理论上讲,我认为这会将指定的文件从s3位置复制到安装位置,同时保留文件的命名。 执行时,我得到一个
[Errno 2]没有这样的文件或目录:/home/username/tmp/filename.csv.F2H1nxR0。
为什么此过程不起作用,为什么还要将这些随机字符串附加到文件名的末尾,如“ F2H1nxR0”所示?
我想出了一种纠正我收到的错误的方法。 问题是我正在将s3.ObjectSummary部分传递到我的download_file()中。 要解决此错误,我将所有部分都转换为字符串,如下所示:
s3_session = boto3.Session(...)
s3_resource = s3_session.resource('s3')
mnt_loc = '/home/username/tmp/'
s3_loc = urlparse('s3://bucket_name/path1/path2/', allow_fragments=False)
s3_files = []
bucket = s3_resource.Bucket(s3_loc.netloc)
for elem in bucket.objects:
s3_files.append(elem)
for elem in s3_files:
bucket = str(elem.bucket_name)
path = str(elem.key)
file_name = str(elem.key.rsplit('/', 1)[-1])
s3_resource.Bucket(bucket).download_file(path, mnt_loc + file_name)
这样就消除了[Errno 2] No这样的文件或目录:/home/username/tmp/filename.csv.F2H1nxR0,并且删除了附加在文件名末尾的8个字符串。 谢谢大家的帮助,因为它使我找到了此修复程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.