鱼C论坛

 找回密码
 立即注册
查看: 194|回复: 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 是保存每组 ...


         看看这个是否符合要求?
  1. import os

  2. p , d , e , k = r'.\aaa' , [] , {} , 0
  3. for each in os . listdir(p) :
  4.     x = os . path . join(p , each)
  5.     if os . path . isfile(x) :
  6.         base , ext = os . path . splitext(each)
  7.         if ext[1 :] . isdigit() :
  8.             if not base in e . keys() :
  9.                 d . append([])
  10.                 e[base] = k
  11.                 k += 1
  12.             d[e[base]] . append((int(ext[1 :]) , x))
  13. for x in d :
  14.     x . sort(reverse=True)
  15.     for y in x:
  16.         if y[0] != x[0][0] : print(y[1] , '- * remove * -')
  17.         else : print(y[1])
复制代码

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

  2. p , d , e , k = r'.\aaa' , [] , {} , 0
  3. for each in os . listdir(p) :
  4.     x = os . path . join(p , each)
  5.     if os . path . isfile(x) :
  6.         base , ext = os . path . splitext(each)
  7.         if ext[1 :] . isdigit() :
  8.             if not base in e . keys() :
  9.                 d . append([])
  10.                 e[base] = k
  11.                 k += 1
  12.             d[e[base]] . append((int(ext[1 :]) , x))
  13. for x in d :
  14.     x . sort(reverse=True)
  15.     for y in x:
  16.         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 是保存每组 ...


         看看这个是否符合要求?
  1. import os

  2. p , d , e , k = r'.\aaa' , [] , {} , 0
  3. for each in os . listdir(p) :
  4.     x = os . path . join(p , each)
  5.     if os . path . isfile(x) :
  6.         base , ext = os . path . splitext(each)
  7.         if ext[1 :] . isdigit() :
  8.             if not base in e . keys() :
  9.                 d . append([])
  10.                 e[base] = k
  11.                 k += 1
  12.             d[e[base]] . append((int(ext[1 :]) , x))
  13. for x in d :
  14.     x . sort(reverse=True)
  15.     for y in x:
  16.         if y[0] != x[0][0] : print(y[1] , '- * remove * -')
  17.         else : print(y[1])
复制代码

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

  2. p , d , e , k = r'.\aaa' , [] , {} , 0
  3. for each in os . listdir(p) :
  4.     x = os . path . join(p , each)
  5.     if os . path . isfile(x) :
  6.         base , ext = os . path . splitext(each)
  7.         if ext[1 :] . isdigit() :
  8.             if not base in e . keys() :
  9.                 d . append([])
  10.                 e[base] = k
  11.                 k += 1
  12.             d[e[base]] . append((int(ext[1 :]) , x))
  13. for x in d :
  14.     x . sort(reverse=True)
  15.     for y in x:
  16.         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 编辑
  1. import os

  2. d = []
  3. for each in os . listdir('.') :
  4.     if os . path . isfile(each) :
  5.         ext = os . path . splitext(each)[1][1 :]
  6.         if ext . isdigit() :
  7.             d . append((int(ext) , each))
  8. d . sort(reverse=True)
  9. for x in d :
  10.     if x[0] != d[0][0] :
  11.         print('remove' , x[1])     # 为了慎重起见,删除操作前,先看看这些文件是否是需要删除的
  12.         # os . remove(x[1])        # 等到确认无误以后,再把这个注释去掉,就可以实用了
复制代码

        【注】,这个代码对扩展名的比较是按整型数操作的,不是按照字符串进行的,因为,如果按字符串比较,那么,会有 '.9' > '.100000000000000' 这样的结果,楼主应该不是需要这样的结果吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-11-24 22:21:08 | 显示全部楼层
本帖最后由 阿奇_o 于 2022-11-24 23:11 编辑
  1. # 假设要处理的文件都在当前工作目录下,可以简单地用 glob('*')获取到这些文件。  (如果不是或是较有规律的,可以进一步了解和使用 glob 的 路径匹配 用法)
  2. >>> from itertools import groupby
  3. >>> from glob import glob
  4. >>> for k, v in groupby(glob('*'), key=lambda f: f.split('.')[0]):
  5. ...     print( k, max( list(v), key=lambda f: int(f.split('.')[-1]) ) )
  6. ...     # os.remove(...)   # 要删,还是要干别的,你就看着办,反正已经分组好了,各组的最大值上一步也找出来了

  7. aaa aaa.20
  8. bbb bbb.25
  9. ccc ccc.4
  10. >>>
  11. # 补充:比如删除
  12. >>> m = [ max(list(v), key=lambda f: int(f.split('.')[-1])) for k, v in groupby(glob('*'), key=lambda f: f.split('.')[0])]
  13. >>> for i in glob('*'):
  14. ...     if i not in m:
  15. ...             os.remove(i)
  16. ...
  17. >>> glob('*')
  18. ['aaa.20', 'bbb.25', 'ccc.4']
  19. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2022-11-24 23:01:40 | 显示全部楼层
本帖最后由 阿奇_o 于 2022-11-24 23:12 编辑

又或者,分组类别不多的话。。  直接:

  1. >>> for i in ['aaa', 'bbb', 'ccc']:
  2. ...     for j in sorted(glob(f'{i}*'), key=lambda f: int(f.split('.')[-1]))[:-1]:    # 不遍历最后一个(最大的),其他都删除掉
  3. ...             os.remove(j)
  4. ...
  5. >>> glob('*')
  6. ['aaa.20', 'bbb.25', 'ccc.4']
  7. >>>
复制代码



想知道小甲鱼最近在做啥?请访问 -> 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 = []

  1. p , d = r'.\aaa' , []
  2. for each in os . listdir(p) :
  3.     x = os . path . join(p , each)
  4.     if os . path . isfile(x) :
  5.         ext = os . path . splitext(each)[1][1 :]
  6.         if ext . isdigit() :
  7.             d . append((int(ext) , x))
  8. d . sort(reverse=True)
  9. for x in d :
  10.     if x[0] != d[0][0] :
  11.         print('remove' , x[1])     #  显示要删除的文件
  12.         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
 楼主| 发表于 7 天前 | 显示全部楼层
jackz007 发表于 2022-11-26 09:46
什么意思,子目录也有数字扩展名,也是只保留数值最大那一个,其它的都删除?

是的,但现有个比较大的问题,就是除了第一组会留最后一个,其他组都删完了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 7 天前 | 显示全部楼层
本帖最后由 jackz007 于 2022-11-28 20:25 编辑
wgij007 发表于 2022-11-28 18:49
是的,但现有个比较大的问题,就是除了第一组会留最后一个,其他组都删完了


       听不懂,什么叫 "除了第一组会留最后一个,其他组都删完了",难道 "其他组" 没有把扩展名最大的文件保留下来?什么又是 "第1组会留最后一个"。你是在抱怨我的代码没有你要求的效果?
       说的具体一点,举例说明,哪些不该删除的文件被删除了,哪些应该被删除的文件没有被删除,用人能听明白的语言描述!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 7 天前 | 显示全部楼层
jackz007 发表于 2022-11-28 20:23
听不懂,什么叫 "除了第一组会留最后一个,其他组都删完了",难道 "其他组" 没有把扩展名最大的 ...

001.jpg 002.jpg

原来的文件,只有一个 01-01.asm.48 没有删除
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 7 天前 | 显示全部楼层
本帖最后由 jackz007 于 2022-11-28 23:34 编辑
wgij007 发表于 2022-11-28 23:24
原来的文件,只有一个 01-01.asm.48 没有删除


        那么,你的希望是什么?你在 1 楼提出的要求只是保留扩展名最大的那个文件,删除所有其它的,没有说还要按文件基本名分组啊。难道你是希望删除所有的文件?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 6 天前 | 显示全部楼层
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
 楼主| 发表于 5 天前 | 显示全部楼层
jackz007 发表于 2022-11-29 10:21
看看这个是否符合要求?

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

没错,是这样的,真的非常感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2022-12-5 10:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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