我必须想出一个解决方案,以删除我们自己的目录结构中除最新文件外的所有文件(除最新文件外的2个文件)。确切地说-其文件版本控制文件夹。一个文件夹中的文件具有以下结构:
Filename.Ext.v[random_Number]
困难的部分是我需要保留一个文件夹中的不同文件。
IE:文件夹A的内容:
在这种情况下,我们有3个“基本文件”。而且我必须保留每个“基本文件”中最新的2个文件。
我尝试使用os.walk
和regex
过滤Python3的基本名称。我尝试在Linux工具中进行构建,例如find
with -ctime
。我也可以使用bash。
但是我真正的问题更多是逻辑。您将如何处理此任务?
编辑2:这是我的进度:
import os
from itertools import groupby
directory = 'C:\\Users\\x41\\Desktop\\Test\\'
def sorted_ls(directory):
mtime = lambda f: os.stat(os.path.join(directory, f)).st_mtime
return list(sorted(os.listdir(directory), key=mtime))
print(sorted_ls(directory))
for basename, group in groupby(sorted_ls(directory), lambda x: x.rsplit('.')[0]):
for i in basename:
finallist = []
for a in group:
finallist.append(a)
print(finallist[:-2])
我快到了 该函数根据该mtime
值对目录中的文件进行排序。建议的groupby()
函数调用我的自定义排序函数。
现在的问题是,我必须在sort()
之前转储,groupby()
因为这会重置我的自定义排序。但是现在它还返回了比预期更多的组。
如果我的排序列表如下所示:
['A.txt.1', 'B.txt.2', 'B.txt.1', 'B.txt.3', 'A.txt.2']
我会得到3组。再次是A,B和A。有什么建议么?
最后结果
这是我具有递归性的最终版本:
import os
from itertools import groupby
directory = r'C:\Users\x41\Desktop\Test'
for dirpath, dirs, files in os.walk(directory):
output = []
for basename, group in groupby(sorted(files), lambda x: x.rsplit('.')[0]):
output.extend(sorted(group, key=lambda x: os.stat(os.path.join(dirpath, x)).st_mtime)[:-2])
for file in output:
os.remove(dirpath + "\\" + file)
您首先需要对文件名进行简单排序,以使它们按字母顺序排列以使groupby
功能正常工作。
对于每个结果文件组,然后可以使用os.stat
密钥进行如下排序:
import os
from itertools import groupby
directory = r'C:\Users\x41\Desktop\Test'
output = []
for basename, group in groupby(sorted(os.listdir(directory)), lambda x: x.rsplit('.')[0]):
output.extend(sorted(group, key=lambda x: os.stat(os.path.join(directory, x)).st_mtime)[-2:])
print output
这将产生一个包含每个组中最新的两个文件的列表。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句