您描述的模式概括爲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