AWS获取S3中所有相关文件路径

你说的曾经没有我的故事 提交于 2020-02-12 21:10:35

在做数据预处理的时候, 先是在local实现, 使用了os去获取单个文件夹下所有文件的路径然后去处理.

def get_file_list(mainfile):
    path_list = []
    for doc in os.listdir(mainfile):
        newpath = os.path.join(mainfile, doc)
        if os.path.isfile(newpath):
            path_list.append(newpath)
    return path_list

然而在将代码转移到AWS Sagemaker时当然就不能使用os去获取路径了. 要理解的是S3是没有folder的概念的, 虽然我们在S3的console里面可以看到类似folder的结构, 但实际上我们只是在不同object的名称中加了prefix而已. (其实我觉得是一个东西…但亚麻强调没有…那就没有吧)下面是获取一个buket中相关key的所有文件路径的方法

import boto3

def get_file_list(bucket_name, prefix):
    s3 = boto3.resource('s3')
    bucket=bucket_name
    my_bucket = s3.Bucket(bucket)
    location_list = []
    for (bucket_name, key) in map(lambda x: (x.bucket_name, x.key), my_bucket.objects.filter(Prefix=prefix)):
        data_location = "s3://{}/{}".format(bucket_name, key)
        location_list.append(data_location)
    # Remove the root folder path
    location_list.remove("s3://{}/{}".format(bucket_name, prefix))
    return location_list

bucket_name: 在S3中建立的桶的名称
prefix: 索引关键词 (有prefix当然就会有suffix可用于筛选文件类型)

值得注意的是这种索引方法最后根目录的路径也会在list中, 这个“folder”的object都乱七八糟的我不好加suffix, 所以我最后remove掉了根目录. 不知道filter有没有什么参数可以避免这一步.

欢迎交流, 谢谢!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!