求助怎样比较文件扩展名
如在同一目录下有文件: aaa.1aaa.2aaa.10aaa.12 aaa.20 bbb.10bbb.12 bbb.25 ccc.01ccc.2ccc.3ccc.4 最终留下扩展名最大的aaa.20 bbb.25 ccc.4 其他删除。感谢。 本帖最后由 jackz007 于 2022-11-29 13:29 编辑wgij007 发表于 2022-11-29 08:00
可能是我说得不清楚,抱歉。
如上图那样,保留01-01.asm.4801-03.asm.2701-007.prt.6 是保存每组 ...
看看这个是否符合要求?
import os
p , d , e , k = r'.\aaa' , [] , {} , 0
for each in os . listdir(p) :
x = os . path . join(p , each)
if os . path . isfile(x) :
base , ext = os . path . splitext(each)
if ext . isdigit() :
if not base in e . keys() :
d . append([])
e = k
k += 1
d] . append((int(ext) , x))
for x in d :
x . sort(reverse=True)
for y in x:
if y != x : print(y , '- * remove * -')
else : print(y)
如果确认删除的文件没有问题,那就直接运行下面这个代码:
import os
p , d , e , k = r'.\aaa' , [] , {} , 0
for each in os . listdir(p) :
x = os . path . join(p , each)
if os . path . isfile(x) :
base , ext = os . path . splitext(each)
if ext . isdigit() :
if not base in e . keys() :
d . append([])
e = k
k += 1
d] . append((int(ext) , x))
for x in d :
x . sort(reverse=True)
for y in x:
if y != x : os . remove(y) 你要怎样?要列表吗,还是看我变魔术给你弄一个函数的 读取目录后,文件名split('.')后取[-1]然后排个序取最后一个,然后其他的文件删掉就行了呗 本帖最后由 jackz007 于 2022-11-24 22:13 编辑
import os
d = []
for each in os . listdir('.') :
if os . path . isfile(each) :
ext = os . path . splitext(each)
if ext . isdigit() :
d . append((int(ext) , each))
d . sort(reverse=True)
for x in d :
if x != d :
print('remove' , x) # 为了慎重起见,删除操作前,先看看这些文件是否是需要删除的
# os . remove(x) # 等到确认无误以后,再把这个注释去掉,就可以实用了
【注】,这个代码对扩展名的比较是按整型数操作的,不是按照字符串进行的,因为,如果按字符串比较,那么,会有 '.9' > '.100000000000000' 这样的结果,楼主应该不是需要这样的结果吧? 本帖最后由 阿奇_o 于 2022-11-24 23:11 编辑
# 假设要处理的文件都在当前工作目录下,可以简单地用 glob('*')获取到这些文件。(如果不是或是较有规律的,可以进一步了解和使用 glob 的 路径匹配 用法)
>>> from itertools import groupby
>>> from glob import glob
>>> for k, v in groupby(glob('*'), key=lambda f: f.split('.')):
... print( k, max( list(v), key=lambda f: int(f.split('.')[-1]) ) )
... # os.remove(...) # 要删,还是要干别的,你就看着办,反正已经分组好了,各组的最大值上一步也找出来了
aaa aaa.20
bbb bbb.25
ccc ccc.4
>>>
# 补充:比如删除
>>> m = [ max(list(v), key=lambda f: int(f.split('.')[-1])) for k, v in groupby(glob('*'), key=lambda f: f.split('.'))]
>>> for i in glob('*'):
... if i not in m:
... os.remove(i)
...
>>> glob('*')
['aaa.20', 'bbb.25', 'ccc.4']
>>>
本帖最后由 阿奇_o 于 2022-11-24 23:12 编辑
又或者,分组类别不多的话。。直接:
>>> for i in ['aaa', 'bbb', 'ccc']:
... for j in sorted(glob(f'{i}*'), key=lambda f: int(f.split('.')[-1]))[:-1]: # 不遍历最后一个(最大的),其他都删除掉
... os.remove(j)
...
>>> glob('*')
['aaa.20', 'bbb.25', 'ccc.4']
>>>
jackz007 发表于 2022-11-24 22:04
【注】,这个代码对扩展名的比较是按整型数操作的,不是按照字符串进行的,因为,如果按字符串比 ...
你好,你这代码运行没出错,但没做任何处理与提示
wgij007 发表于 2022-11-25 18:53
你好,你这代码运行没出错,但没做任何处理与提示
目前,这个代码只是把要删除的文件 print() 出来,如果,你认为没有问题,就把 12 行前面的 '#' 删掉,然后再运行,就会把那些文件真的统统都删除掉。 本帖最后由 wgij007 于 2022-11-26 00:09 编辑
jackz007 发表于 2022-11-25 19:13
目前,这个代码只是把要删除的文件 print() 出来,如果,你认为没有问题,就把 12 行前面的 '# ...
不知怎的,加上路径就不会处理了,也不报错
d = []
for each in os.listdir(r'.\aaa') :
print (each)
if os.path.isfile(each) :
ext = os.path.splitext(each)
if ext.isdigit() :
d.append((int(ext) , each))
d.sort(reverse=True)
for x in d :
if x != d :
print('remove' , x) # 为了慎重起见,删除操作前,先看看这些文件是否是需要删除的
# os . remove(x) # 等到确认无误以后,再把这个注释去掉,就可以实用了 本帖最后由 jackz007 于 2022-11-26 00:22 编辑
wgij007 发表于 2022-11-25 23:57
不知怎的,加上路径就不会处理了,也不报错
d = []
p , d = r'.\aaa' , []
for each in os . listdir(p) :
x = os . path . join(p , each)
if os . path . isfile(x) :
ext = os . path . splitext(each)
if ext . isdigit() :
d . append((int(ext) , x))
d . sort(reverse=True)
for x in d :
if x != d :
print('remove' , x) #显示要删除的文件
os . remove(x) # 【注意】:现在会真的删除文件!!! jackz007 发表于 2022-11-26 00:20
现在发现一个问题,第一组可以保留最后一个,第二组全删了。问下能不能子目录也能这样处理。 wgij007 发表于 2022-11-26 00:41
现在发现一个问题,第一组可以保留最后一个,第二组全删了。问下能不能子目录也能这样处理。
什么意思,子目录也有数字扩展名,也是只保留数值最大那一个,其它的都删除? jackz007 发表于 2022-11-26 09:46
什么意思,子目录也有数字扩展名,也是只保留数值最大那一个,其它的都删除?
是的,但现有个比较大的问题,就是除了第一组会留最后一个,其他组都删完了
本帖最后由 jackz007 于 2022-11-28 20:25 编辑
wgij007 发表于 2022-11-28 18:49
是的,但现有个比较大的问题,就是除了第一组会留最后一个,其他组都删完了
听不懂,什么叫 "除了第一组会留最后一个,其他组都删完了",难道 "其他组" 没有把扩展名最大的文件保留下来?什么又是 "第1组会留最后一个"。你是在抱怨我的代码没有你要求的效果?
说的具体一点,举例说明,哪些不该删除的文件被删除了,哪些应该被删除的文件没有被删除,用人能听明白的语言描述!!! jackz007 发表于 2022-11-28 20:23
听不懂,什么叫 "除了第一组会留最后一个,其他组都删完了",难道 "其他组" 没有把扩展名最大的 ...
原来的文件,只有一个 01-01.asm.48 没有删除 本帖最后由 jackz007 于 2022-11-28 23:34 编辑
wgij007 发表于 2022-11-28 23:24
原来的文件,只有一个 01-01.asm.48 没有删除
那么,你的希望是什么?你在 1 楼提出的要求只是保留扩展名最大的那个文件,删除所有其它的,没有说还要按文件基本名分组啊。难道你是希望删除所有的文件? jackz007 发表于 2022-11-28 23:30
那么,你的希望是什么?你在 1 楼提出的要求只是保留扩展名最大的那个文件,删除所有其它的, ...
可能是我说得不清楚,抱歉。
如上图那样,保留01-01.asm.4801-03.asm.2701-007.prt.6 是保存每组文件扩展名最大的
现在出的结果是 只保留01-01.asm.48 其他的全删了。 jackz007 发表于 2022-11-29 10:21
看看这个是否符合要求?
如果确认删除的文件没有问题,那就直接运行下面这个代码 ...
没错,是这样的,真的非常感谢!
页:
[1]