Шаблон, который вы описываете, обобщает для MapReduce. Я нашел простую реализацию MapReduce онлайн, из которой еще более простая версия:
def map_reduce(data, mapper, reducer):
d = {}
for elem in data:
key, value = mapper(elem)
d.setdefault(key, []).append(value)
for key, grp in d.items():
d[key] = reducer(key, grp)
return d
Вы хотите сгруппировать все файлы по их именам без расширения, которое вы можете получить из os.path.splitext(fname)[0]
. Затем вы хотите сделать тарбол из каждой группы, используя модуль tarfile
. В коде это:
import os
import tarfile
def make_tar(basename, files):
tar = tarfile.open(basename + '.tar', 'w')
for f in files:
tar.add(f)
tar.close()
map_reduce(os.listdir('.'),
lambda x: (os.path.splitext(x)[0], x),
make_tar)
Редактировать : Если вы хотите сгруппировать файлы различными способами, вам просто нужно изменить второй аргумент на map_reduce
. Приведенный выше код группирует файлы, имеющие одинаковое значение для выражения os.path.splitext(x)[0]
. Таким образом, чтобы сгруппировать по базовому имени файла с все расширения, которые были удалены, вы можете заменить это выражение на strip_all_ext(x)
и добавить:
def strip_all_ext(path):
head, tail = os.path.split(path)
basename = tail.split(os.extsep)[0]
return os.path.join(head, basename)