首页 > 解决方案 > 在 Sequence Python-AWS 中读取文件

问题描述

我在 S3 存储桶中有一些文件夹,其中有文件。由于 S3 像 unix 系统一样存储数据,因此文件夹编号的顺序是 1,10,11,12,2,3 而不是 1,2,3,10,11,12..

我想按顺序读取文件夹 1,2,3,10,11,12.. 然后读取其中的文件..

我附上了一个片段以及我正在尝试的代码,但它没有按我想要的方式工作。如您所见,文件夹名称有一个数字(-0.png-analysis,-1.png-analysis,-10.png-analysis,-11.png-analysis,-2.png-analysis),但排序不正确.. 有没有办法按 0、1、2、3、10、11 的顺序读取它们?

for i in bucket.objects.all():
    #print(i.key)
    if i.key.endswith('tables.csv'):
        #s = i.key.split('-')[2]
        print(i.key.split('/')[1])
        #print(sorted(s,key = lambda x: x.split('.')))
        #p = i.key.split('-')[2]
        #print(p)

在此处输入图像描述

标签: pythonpython-3.xamazon-s3aws-lambdaboto3

解决方案


正如我所说,使用它们的序列号作为字典中的键存储所有对象并在此字典上迭代。

这是它的样子


import boto3
import collections

s3 = boto3.client('s3')    
my_dict = {}

for obj in bucket.objects.all():
    if obj.key.endswith('tables.csv'):
        my_dict[int(obj.key.split('/')[1].split('-')[2].split('.')[0])] = obj.key
    
print(my_dict)

od = collections.OrderedDict(sorted(my_dict.items()))

for k,v in od.items():
    csv_obj = s3.get_object(Bucket='bucket', Key=v) 
    print(csv_obj['Body'].read().decode('utf-8'))

注意:我假设您没有任何两个具有相同序列的文件,因为这只会获取具有该序列号的最新文件,并且您将无法检索以前的文件。

从https://stackoverflow.com/a/9001529/9387017复制的 OrderedDict


推荐阅读