Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何访问AWS s3 bucket中的子文件夹(对象)并将其保存到python中的列表中?_Python_Amazon Web Services_Amazon S3_Boto3_Boto - Fatal编程技术网

如何访问AWS s3 bucket中的子文件夹(对象)并将其保存到python中的列表中?

如何访问AWS s3 bucket中的子文件夹(对象)并将其保存到python中的列表中?,python,amazon-web-services,amazon-s3,boto3,boto,Python,Amazon Web Services,Amazon S3,Boto3,Boto,这是我的s3桶 s3.Bucket(name='external') 我正在使用bot3.resource方法: s3 = boto3.resource( 's3', region_name='ap-southeast-1', aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key ) s3文件夹结构如下所示: external\product\2018\

这是我的s3桶

s3.Bucket(name='external')
我正在使用bot3.resource方法:

s3 = boto3.resource(
    's3',
    region_name='ap-southeast-1',
    aws_access_key_id=aws_access_key_id,
    aws_secret_access_key=aws_secret_access_key
)
s3文件夹结构如下所示:

external\product\2018\abc.csv
external\product\2019\abc.csv
external\bom\2018\csd.csv
external\bom\2019\zyc.csv
请注意,20182019也是内部产品和bom

我试着这样做:


bucket = s3.Bucket(bucket)
print(bucket)
result = bucket.meta.client.list_objects(Bucket=bucket.name,
                                         Delimiter='/')
print(result)                                    
for o in result.get('CommonPrefixes'):
    print(o.get('Prefix'))
这只会让我:

product\
bom\
我真正需要的是年度清单:

2018\
2019\
2018\
2019\
并将其存储为两个单独的列表产品和bom

Product =['2018','2019']
Bom = ['2018','2019']




这样做的方法很少。一种方法如下所示

基于以下示例,并假设文件夹结构是固定的:

external\bom\2017\csd.csv
external\bom\2018\csd.csv
external\bom\2019\zyc.csv
external\product\2018\abc.csv
external\product\2019\abc.csv
external\product\2020\abc.csv
以下python脚本可以工作:

import boto3

from collections import defaultdict

session = boto3.session.Session(profile_name='<profile-name>')

bucket = session.resource('s3').Bucket('external')

key_year = defaultdict(set)

for obj in bucket.objects.all():
    key_split = obj.key.split('\\')
    key_year[key_split[1]].add(key_split[2])

for k in key_year:
    print(k, key_year[k])

这样做的方法很少。一种方法如下所示

基于以下示例,并假设文件夹结构是固定的:

external\bom\2017\csd.csv
external\bom\2018\csd.csv
external\bom\2019\zyc.csv
external\product\2018\abc.csv
external\product\2019\abc.csv
external\product\2020\abc.csv
以下python脚本可以工作:

import boto3

from collections import defaultdict

session = boto3.session.Session(profile_name='<profile-name>')

bucket = session.resource('s3').Bucket('external')

key_year = defaultdict(set)

for obj in bucket.objects.all():
    key_split = obj.key.split('\\')
    key_year[key_split[1]].add(key_split[2])

for k in key_year:
    print(k, key_year[k])

obj.key.split('\\'):为什么要使用双\\@Anti\u cse51,因为您的文件夹名包含'\\'。与“/”.obj.key.split(“\\”)不同,您必须对其进行转义:为什么要使用双\\@Anti\u cse51,因为您的文件夹名包含“\\”。你必须避开它,不像“/”那样。