S3在存储桶中列出子文件夹中的所有文件。
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。
谢谢!
问题出现的原因是:
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 再次检查您的对象。