您所描述的模式可以推广到 MapReduce。我在网上找到了 MapReduce 的a simple implementation,其中一个更简单的版本是:
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 模块从每个组中制作一个 tarball。在代码中,即:
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] 具有相同值的文件进行分组。因此,要通过 all 去除扩展名的基本文件名进行分组,您可以将该表达式替换为 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)