在做数据预处理的时候, 先是在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有没有什么参数可以避免这一步.
欢迎交流, 谢谢!
来源:CSDN
作者:老板不要葱花
链接:https://blog.csdn.net/GooodPython/article/details/104283279