S3在存储桶中列出子文件夹中的所有文件。

10 浏览
0 Comments

S3在存储桶中列出子文件夹中的所有文件。

我有一个S3存储桶,其中的文件按照文件夹结构folder1/folder2进行组织。

我想要列出文件夹结构下的文件,并在Sagemaker Jupyter笔记本中遍历这些文件。

我该如何实现?我尝试了Listing contents of a bucket with boto3中的指示,但只能递归地列出顶层文件。但我只想列出文件夹级别的文件。

我还尝试了下面的代码片段:

import boto3
s3 = boto3.resource('s3')
my_bucket = s3.Bucket('bucketname/folder1/folder2')
for my_bucket_object in my_bucket.objects.all():
    print(my_bucket_object)

但是我得到了以下错误:

ParamValidationError: 参数验证失败:无效的存储桶名称...

目前使用的是Python 3.9。

谢谢!

0
0 Comments

问题出现的原因是:

1. `bucketname` 是存储桶的名称。

2. `folder1/folder2/` 是键前缀。

3. 需要过滤列表,而不是获取所有对象。

解决方法如下:

import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('bucketname')
for object_summary in bucket.objects.filter(Prefix='folder1/folder2/'):
    print(object_summary)

这将打印出一个 `ObjectSummary` 值的列表,例如:

s3.ObjectSummary(bucket_name='bucketname', key='folder1/folder2/')
s3.ObjectSummary(bucket_name='bucketname', key='folder1/folder2/abc.csv')
s3.ObjectSummary(bucket_name='bucketname', key='folder1/folder2/def.csv')
s3.ObjectSummary(bucket_name='bucketname', key='folder1/folder2/xyz.png')
s3.ObjectSummary(bucket_name='bucketname', key='folder1/folder2/folder3/')

请注意,它将包括 `folder1/folder2/` 级别的所有对象,无论其文件扩展名后缀如何,并且可能会包括该文件夹本身(`folder1/folder2/`)和任何逻辑子文件夹,如 `folder1/folder2/folder3/`。

您可以按以下方式检索对象:

for object_summary in bucket.objects.filter(Prefix="folder1/folder2/"):
    print(object_summary.Object().key)

这将打印出一个 `Object` 键的列表,例如:

folder1/folder2/
folder1/folder2/abc.csv
folder1/folder2/def.csv
folder1/folder2/xyz.png
folder1/folder2/folder3/

您可以根据需要筛选出 CSV 文件,例如:

summaries = bucket.objects.filter(Prefix="folder1/folder2/")
csvs = [x for x in summaries if x.Object().key.endswith(".csv")]
for objectsummary in csvs:
    print(objectsummary.Object().key)

这将打印出:

folder1/folder2/abc.csv
folder1/folder2/def.csv

您还可以按如下方式拆分出实际文件名:

for objectsummary in csvs:
    print(objectsummary.Object().key.split("/")[-1])

这将打印出:

abc.csv
def.csv

如果您仍然看到问题,请使用 awscli 双重检查您的对象,例如:

aws s3 ls s3://bucketname/folder1/folder2/

感谢您的反馈,我已经更新了有关 `ObjectSummary` 和 `Object` 值的更多详细信息。如果您仍然遇到问题,请在此处发表评论。另外,请使用 awscli 再次检查您的对象。

0