我当前正在编写一个脚本,在该脚本中需要将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”)?
答案 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个字符串。谢谢大家的帮助,因为它帮助我找到了此修复程序。