您描述的模式概括为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]
具有相同值的文件。因此,通过与基本文件名组中的所有扩展剥下,你可以替换表达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)
无论如何改变这个代码或使用os.path.extsep为了从一个文件拆分多个扩展。例如'foobar.aux.xml' – KennyC 2011-05-08 22:22:25
@KennyC:更新回答 – Karmastan 2011-05-08 22:56:50
@Karamastan:完美!连续的工作。谢谢 – KennyC 2011-05-09 14:43:22