Python 分组和删除文件
我必须想出一个解决方案来删除所有文件,除了我们自己的云目录结构中最新的2个文件。确切地说,它是文件版本控制文件夹。一个文件夹中有以下结构的文件:Python 分组和删除文件,python,regex,linux,bash,sorting,Python,Regex,Linux,Bash,Sorting,我必须想出一个解决方案来删除所有文件,除了我们自己的云目录结构中最新的2个文件。确切地说,它是文件版本控制文件夹。一个文件夹中有以下结构的文件: Filename.Ext.v[随机数] 最困难的是,我需要在一个文件夹中保存不同的文件 IE:文件夹A的内容: HelloWorld.txt.v123 HelloWorld.txt.v555 HelloWorld.txt.v666 OtherFile.pdf.v143 OtherFile.pdf.v1453 OtherFile.pdf.v123 Ot
Filename.Ext.v[随机数]
最困难的是,我需要在一个文件夹中保存不同的文件
IE:文件夹A的内容:
- HelloWorld.txt.v123
- HelloWorld.txt.v555
- HelloWorld.txt.v666
- OtherFile.pdf.v143
- OtherFile.pdf.v1453
- OtherFile.pdf.v123
- OtherFile.pdf.v14345
- YetOtherFile.docx.v1113
os.walk
和regex
尝试了Python3,以过滤掉basename。我用-ctime
尝试了内置Linux工具,如find
。我也可以用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()
函数调用我的自定义排序函数
现在这里的问题是,我必须在groupby()
之前转储sort()
,因为这将重置我的自定义排序。但它现在也返回了比预期更多的群体
如果我的排序列表如下所示:
['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)
这里的逻辑并不难,如果这是你唯一想要的
例如,在python字典中,您可以按基本名称对文件进行分组,其中键是“基本文件名”,如“HelloWorld.txt”,值是按ctime排序的具有相同基本名称的所有文件的列表(或其他时间度量,取决于您如何定义最新文件),然后从索引2开始相应地删除列表中的所有文件。您需要首先对文件名进行简单排序,使其按字母顺序排列,以允许
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
这将生成一个列表,其中包含每个组中最新的两个文件。我使用
groupby()
更新了我的代码-但还存在一些小问题。我想我知道您现在正在尝试做什么。我已经更新了我的脚本。