鱼C论坛

 找回密码
 立即注册
查看: 3889|回复: 18

[已解决]求助怎样比较文件扩展名

[复制链接]
发表于 2022-11-24 18:34:35 | 显示全部楼层 |阅读模式
20鱼币
如在同一目录下有文件:   aaa.1  aaa.2  aaa.10  aaa.12 aaa.20    bbb.10  bbb.12 bbb.25    ccc.01  ccc.2  ccc.3  ccc.4    最终留下扩展名最大的  aaa.20   bbb.25   ccc.4   其他删除。感谢。
最佳答案
2022-11-24 18:34:36
本帖最后由 jackz007 于 2022-11-29 13:29 编辑
wgij007 发表于 2022-11-29 08:00
可能是我说得不清楚,抱歉。

如上图那样,保留01-01.asm.48  01-03.asm.27  01-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[1 :] . isdigit() :
            if not base in e . keys() :
                d . append([])
                e[base] = k
                k += 1
            d[e[base]] . append((int(ext[1 :]) , x))
for x in d :
    x . sort(reverse=True)
    for y in x:
        if y[0] != x[0][0] : print(y[1] , '- * remove * -')
        else : print(y[1])
        如果确认删除的文件没有问题,那就直接运行下面这个代码:
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[1 :] . isdigit() :
            if not base in e . keys() :
                d . append([])
                e[base] = k
                k += 1
            d[e[base]] . append((int(ext[1 :]) , x))
for x in d :
    x . sort(reverse=True)
    for y in x:
        if y[0] != x[0][0] : os . remove(y[1])

最佳答案

查看完整内容

看看这个是否符合要求? 如果确认删除的文件没有问题,那就直接运行下面这个代码:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-24 18:34:36 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-11-29 13:29 编辑
wgij007 发表于 2022-11-29 08:00
可能是我说得不清楚,抱歉。

如上图那样,保留01-01.asm.48  01-03.asm.27  01-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[1 :] . isdigit() :
            if not base in e . keys() :
                d . append([])
                e[base] = k
                k += 1
            d[e[base]] . append((int(ext[1 :]) , x))
for x in d :
    x . sort(reverse=True)
    for y in x:
        if y[0] != x[0][0] : print(y[1] , '- * remove * -')
        else : print(y[1])
        如果确认删除的文件没有问题,那就直接运行下面这个代码:
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[1 :] . isdigit() :
            if not base in e . keys() :
                d . append([])
                e[base] = k
                k += 1
            d[e[base]] . append((int(ext[1 :]) , x))
for x in d :
    x . sort(reverse=True)
    for y in x:
        if y[0] != x[0][0] : os . remove(y[1])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-24 18:54:15 | 显示全部楼层
你要怎样?要列表吗,还是看我变魔术给你弄一个函数的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-24 21:46:37 | 显示全部楼层
读取目录后,文件名split('.')后取[-1]然后排个序取最后一个,然后其他的文件删掉就行了呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-24 22:04:38 | 显示全部楼层
本帖最后由 jackz007 于 2022-11-24 22:13 编辑
import os

d = []
for each in os . listdir('.') :
    if os . path . isfile(each) :
        ext = os . path . splitext(each)[1][1 :]
        if ext . isdigit() :
            d . append((int(ext) , each))
d . sort(reverse=True)
for x in d :
    if x[0] != d[0][0] : 
        print('remove' , x[1])     # 为了慎重起见,删除操作前,先看看这些文件是否是需要删除的
        # os . remove(x[1])        # 等到确认无误以后,再把这个注释去掉,就可以实用了
        【注】,这个代码对扩展名的比较是按整型数操作的,不是按照字符串进行的,因为,如果按字符串比较,那么,会有 '.9' > '.100000000000000' 这样的结果,楼主应该不是需要这样的结果吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-24 22:21:08 | 显示全部楼层
本帖最后由 阿奇_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('.')[0]):
...     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('.')[0])]
>>> for i in glob('*'):
...     if i not in m:
...             os.remove(i)
...
>>> glob('*')
['aaa.20', 'bbb.25', 'ccc.4']
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-24 23:01:40 | 显示全部楼层
本帖最后由 阿奇_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']
>>>


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-25 18:53:45 | 显示全部楼层
jackz007 发表于 2022-11-24 22:04
【注】,这个代码对扩展名的比较是按整型数操作的,不是按照字符串进行的,因为,如果按字符串比 ...

你好,你这代码运行没出错,但没做任何处理与提示
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-25 19:13:11 | 显示全部楼层
wgij007 发表于 2022-11-25 18:53
你好,你这代码运行没出错,但没做任何处理与提示


        目前,这个代码只是把要删除的文件 print() 出来,如果,你认为没有问题,就把 12 行前面的 '#' 删掉,然后再运行,就会把那些文件真的统统都删除掉。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-25 23:57:07 | 显示全部楼层
本帖最后由 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)[1][1 :]
        if ext.isdigit() :
            d.append((int(ext) , each))
d.sort(reverse=True)
for x in d :
    if x[0] != d[0][0] :
        print('remove' , x[1])     # 为了慎重起见,删除操作前,先看看这些文件是否是需要删除的
    # os . remove(x[1])        # 等到确认无误以后,再把这个注释去掉,就可以实用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-26 00:20:24 | 显示全部楼层
本帖最后由 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)[1][1 :]
        if ext . isdigit() :
            d . append((int(ext) , x))
d . sort(reverse=True)
for x in d :
    if x[0] != d[0][0] :
        print('remove' , x[1])     #  显示要删除的文件
        os . remove(x[1])          # 【注意】:现在会真的删除文件!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-26 00:41:04 | 显示全部楼层

001.jpg 002.jpg

现在发现一个问题,第一组可以保留最后一个,第二组全删了。问下能不能子目录也能这样处理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-26 09:46:15 | 显示全部楼层
wgij007 发表于 2022-11-26 00:41
现在发现一个问题,第一组可以保留最后一个,第二组全删了。问下能不能子目录也能这样处理。

        什么意思,子目录也有数字扩展名,也是只保留数值最大那一个,其它的都删除?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-28 18:49:54 | 显示全部楼层
jackz007 发表于 2022-11-26 09:46
什么意思,子目录也有数字扩展名,也是只保留数值最大那一个,其它的都删除?

是的,但现有个比较大的问题,就是除了第一组会留最后一个,其他组都删完了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-28 20:23:34 | 显示全部楼层
本帖最后由 jackz007 于 2022-11-28 20:25 编辑
wgij007 发表于 2022-11-28 18:49
是的,但现有个比较大的问题,就是除了第一组会留最后一个,其他组都删完了


       听不懂,什么叫 "除了第一组会留最后一个,其他组都删完了",难道 "其他组" 没有把扩展名最大的文件保留下来?什么又是 "第1组会留最后一个"。你是在抱怨我的代码没有你要求的效果?
       说的具体一点,举例说明,哪些不该删除的文件被删除了,哪些应该被删除的文件没有被删除,用人能听明白的语言描述!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-28 23:24:14 | 显示全部楼层
jackz007 发表于 2022-11-28 20:23
听不懂,什么叫 "除了第一组会留最后一个,其他组都删完了",难道 "其他组" 没有把扩展名最大的 ...

001.jpg 002.jpg

原来的文件,只有一个 01-01.asm.48 没有删除
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-28 23:30:18 | 显示全部楼层
本帖最后由 jackz007 于 2022-11-28 23:34 编辑
wgij007 发表于 2022-11-28 23:24
原来的文件,只有一个 01-01.asm.48 没有删除


        那么,你的希望是什么?你在 1 楼提出的要求只是保留扩展名最大的那个文件,删除所有其它的,没有说还要按文件基本名分组啊。难道你是希望删除所有的文件?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-29 08:00:22 | 显示全部楼层
jackz007 发表于 2022-11-28 23:30
那么,你的希望是什么?你在 1 楼提出的要求只是保留扩展名最大的那个文件,删除所有其它的, ...

可能是我说得不清楚,抱歉。

如上图那样,保留01-01.asm.48  01-03.asm.27  01-007.prt.6 是保存每组文件扩展名最大的

现在出的结果是 只保留01-01.asm.48 其他的全删了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-30 08:03:11 | 显示全部楼层
jackz007 发表于 2022-11-29 10:21
看看这个是否符合要求?

        如果确认删除的文件没有问题,那就直接运行下面这个代码 ...

没错,是这样的,真的非常感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-25 11:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表