Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 分组和删除文件_Python_Regex_Linux_Bash_Sorting - Fatal编程技术网

Python 分组和删除文件

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

我必须想出一个解决方案来删除所有文件,除了我们自己的云目录结构中最新的2个文件。确切地说,它是文件版本控制文件夹。一个文件夹中有以下结构的文件:

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
在本例中,我们有3个“基本文件”。我必须保留每个“基本文件”的最新2个文件

我用
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()
更新了我的代码-但还存在一些小问题。我想我知道您现在正在尝试做什么。我已经更新了我的脚本。