繁体   English   中英

使用Boto3下载S3文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM