从s3递归复制数据,使用python boto3更改文件夹结构

时间:2018-10-17 15:23:40

标签: python amazon-s3 boto3

我在s3中有一个数据sr = ab / pt = 01 / pt = 02 / pt = 03其中有多个文件夹。 pt = 03下面包含所有数据。

var Courses = _Context.Classes
                                .Include(t => t.Teachers)
                                .Include(c => c.Courses)
                                .Include(s => s.ClassSchedule)
                                .OrderBy(t => t.Teachers.LastName)
                                .ThenBy(s => s.ClassSchedule.DayID)
                                .ThenBy(s => s.ClassSchedule.PeriodID)
                                .Select(p => new ClassDTO
                                {
                                    TeacherId = p.teacherId,
                                    FirstName = p.Teachers.FirstName,
                                    LastName = p.Teachers.LastName,
                                    Course = p.Courses.courseCode,
                                    Section = p.classSection,
                                    Room = p.roomId,
                                    Students = 0,
                                    Day = p.ClassSchedule.DayID,
                                    Block = p.ClassSchedule.PeriodID,
                                    ClassId = p.classId
                                })
                                .ToList();

我正在关注输出

`
old_bucket_name = 'bucket'
old_prefix = 'sr=ab/pt=01/pt=02/pt=03'
new_bucket_name = 'bucket'
new_prefix = old_prefix.split("=")[3].strip()
s3 = boto3.resource('s3')
old_bucket = s3.Bucket(old_bucket_name )
new_bucket = s3.Bucket(new_bucket_name )
for obj in old_bucket.objects.filter(Prefix=old_prefix):
  old_source = { 'Bucket': old_bucket_name,
                 Key': obj.key}
  new_key = obj.key.replace(old_prefix, new_prefix)
  new_obj = new_bucket.Object(new_key)
  new_obj.copy(old_source)`

我期望类似以下内容

03/list of files

1 个答案:

答案 0 :(得分:1)

显然,您想重新格式化

中的前缀

sr=ab/pt=01/pt=02/pt=03ab/01/02/03

似乎您只是在不了解python函数的情况下简单地复制了某些人的代码。

我假设=符号的前部是随机的,因此我不会采用保留“ /”分隔符的快捷方式。因此需要多个拆分联接。

old_prefix = 'sr=ab/pt=01/pt=02/pt=03'
step1 = old_prefix.split('/') 
step2 = [x.split('=')[1] for x in step1]
new_prefix = "/".join(step2)

您可以使上述代码更精简。

new_prefix = "/".join([x.split('=')[1] for x in old_prefix.split('/')])