我有这个问题,我试图解决,但我找不到答案。这个问题实际上有两个方面。第一部分是列出AWS中s3存储桶中的所有文件。第二部分是下载我从列表中选择的文件。
第1部分:列出所有文件
所以,我知道如何打印所有文件的列表:
session = Session(aws_access_key_id = ACCESS_KEY,
aws_secret_access_key = SECRET_KEY)
s3 = session.resource('s3')
bucket = s3.Bucket('my bucket')
for s3_file in bucket.objects.all():
print(s3_file.key)
现在,对于我未来的工作,我需要将文件名保存在一个列表中,我可以从中提取特定的文件名(即它们是具有特定部分名称的csv-file)。因此,我将把上面的代码修改为:
session = Session(aws_access_key_id = ACCESS_KEY,
aws_secret_access_key = SECRET_KEY)
s3 = session.resource('s3')
bucket = s3.Bucket('my bucket')
my_files =[]
for s3_file in bucket.objects.all():
my_files.append(outputfilename)
,但这不起作用,因为它返回的文件列表中只有第一个文件名
['020/12/dagsrapport-2020-12-09.csv',
'020/12/dagsrapport-2020-12-09.csv',
'020/12/dagsrapport-2020-12-09.csv',
'020/12/dagsrapport-2020-12-09.csv',
'020/12/dagsrapport-2020-12-09.csv',
'020/12/dagsrapport-2020-12-09.csv',
'020/12/dagsrapport-2020-12-09.csv',
'020/12/dagsrapport-2020-12-09.csv',
'020/12/dagsrapport-2020-12-09.csv',
'020/12/dagsrapport-2020-12-09.csv',
'020/12/dagsrapport-2020-12-09.csv',
'020/12/dagsrapport-2020-12-09.csv',
'020/12/dagsrapport-2020-12-09.csv',
'020/12/dagsrapport-2020-12-09.csv',
'020/12/dagsrapport-2020-12-09.csv',
'020/12/dagsrapport-2020-12-09.csv',
'020/12/dagsrapport-2020-12-09.csv',
and so on]
我不明白我做错了什么。
第2部分:下载列表
中的所有文件既然我已经保存了一个文件列表,我需要在本地下载它们。现在,为了做到这一点,我找到了以下代码:
filenames = list
for i in filenames:
filename = i
#print(i)
bucket_name = 'my bucket'
outputfilename = filename[1:]
outputfilename = outputfilename.replace(':','_')
session = Session(aws_access_key_id = ACCESS_KEY,
aws_secret_access_key = SECRET_KEY)
s3 = session.resource('s3')
your_bucket = s3.Bucket('my bucket')
s3 = boto3.client('s3',aws_access_key_id=ACCESS_KEY,aws_secret_access_key=SECRET_KEY)
s3.download_file(bucket_name,filename,outputfilename)
print(outputfilename)
但不能在本地下载。我对这个完全陌生,我在谷歌上搜索了所有可能的解决方案,阅读了大多数关于SO的帖子,但无法得到正确的答案。
如果您能在这些问题上提供任何帮助,我将不胜感激。
注意事项:
- 无需在代码文件中引用AWS凭据。相反,使用AWS CLI
aws configure
命令将凭据存储在配置文件中。Boto会自动找到并使用它们。 - 在第1部分的第二个代码块中,它引用了
outputfilename
,但该值没有在循环中的任何地方设置。因此,错误的输出。 - 下载文件时,如果文件名包含文件夹(如
020/12/dagsrapport-2020-12-09.csv
),那么确保这些文件夹已经存在于您的本地磁盘上。或者,将斜杠更改为其他内容。
下面是一些您可能想要扩展的代码:
import boto3
s3_resource = boto3.resource('s3')
bucket = s3_resource.Bucket('MYBUCKET')
# If you want a list of Keys, use:
key_list = [object.key for object in bucket.objects.all()]
print(key_list)
# Or, if you want to loop through each object and download them
for object in bucket.objects.all():
filename = object.key.replace('/', '_')
object.Object().download_file(filename)
print(filename)
记住:Amazon S3的boto3文档是您的朋友!