使用Boto3下载S3文件

时间:2019-08-16 21:16:39

标签: python amazon-s3 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”)?

1 个答案:

答案 0 :(得分:0)

我想出一种纠正我收到的错误的方法。问题是我正在将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]否这样的文件或目录:/home/username/tmp/filename.csv.F2H1nxR0,并且删除了附加在文件名末尾的8个字符串。谢谢大家的帮助,因为它帮助我找到了此修复程序。