鱼C论坛

 找回密码
 立即注册
查看: 1405|回复: 10

[已解决]批量删除一个文件夹中与另一个文件夹名称相同的图片

[复制链接]
发表于 2020-8-7 20:36:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 yrhhh 于 2020-8-7 20:38 编辑

急求助大佬们一个问题
具体问题就是现在有两个文件夹 A和B (假设A有100张,B有10张,但是A中的100张里面包括B中的10张),现在要从A中删除这10张和B重复的图片
下面的代码可以实现吗?后面部分要不要注释呐 注释掉的部分不注释输出结果和注释掉是一样的。。。。。。后面图片是最终输出了重复图片的名字 但是没有从文件夹中删除 是不是因为这个python2的代码不能在python3实现啊

  1. #!/usr/bin/env python
  2. # encoding: UTF-8
  3. # function : 比较两个文件夹里面的图片,重复的删除

  4. import glob
  5. import os
  6. import numpy as np
  7. from PIL import Image

  8. #outDir = os.path.abspath

  9. #Use the function: os.path.join
  10. imageDir1 = os.path.abspath('C:/Users/sheryood/Desktop/Compared/Wait_to_delete')#待删除图片的文件夹

  11. #Define the List of the images
  12. image1 = []

  13. #Get the absolute path of the images
  14. imageList1 = glob.glob(os.path.join(imageDir1, '*.jpg'))

  15. #Use the function: os.path.basename() Get the name of the images
  16. for item in imageList1:
  17.     image1.append(os.path.basename(item))

  18. imageDir2 = os.path.abspath('C:/Users/sheryood/Desktop/Compared')#对比文件夹
  19. image2 = []
  20. imageList2 = glob.glob(os.path.join(imageDir2, '*.jpg'))

  21. for item in imageList2:
  22.     image2.append(os.path.basename(item))

  23. for item in image1:
  24.     print (item)

  25. for item in image2:
  26.     print (item)

  27. for item1 in image1:
  28.     for item2 in image2:
  29.         if item1 == item2:
  30.             """
  31.             dir = imageList1(image1.index( item1 + '.jpg'))
  32.             img = Image.open(dir)
  33.             name = os.path.basename(dir)
  34.             """
  35.             os.remove(imageDir1+'\\'+item1)
  36.             """
  37.             img = Image.open(os.path.join(imageDir2, item1))
  38.             os.remove(os.path.join(imageDir1, item1))
  39.             img.save(os.path.join(outDir, item2))
  40.             img.remove()
  41.             img.remove(os.path.join( item1))
  42.             img.remove(os.path.join(imageDir1, item1))
  43.             """
  44.             
  45.                
复制代码


最佳答案
2020-8-8 17:44:52
这是我写的通过效验文件抽样MD5和文件大小的程序,稍微改了改,给你用吧。
代码:
  1. import hashlib
  2. from os import walk as os_walk
  3. from os import sep,remove
  4. from os.path import getsize,expanduser
  5. from os.path import join as os_join
  6. import easygui

  7. class Delete_Repeat_File:
  8.     def __init__(self,sign=1):
  9.         self.sign = sign

  10.         # 所有遍历到的文件(不包括重复文件)
  11.         self.all_file = {}
  12.         
  13.         # 所有重复文件
  14.         self.all_repeat_file = []
  15.         
  16.     def main(self):
  17.         # 刷新主窗口
  18.         while True:
  19.             file = easygui.diropenbox(f'线程{self.sign}:请选择将要清理的文件夹。')
  20.             
  21.             # 返回-1表示取消操作
  22.             if file == -1:
  23.                 return '操作被取消!'
  24.             
  25.             # 集合目录
  26.             _dir = []
  27.             _dir.extend(file)

  28.             
  29.             # 如果所选文件里没有目录
  30.             if not _dir:
  31.                 print(f'线程{self.sign}:未指定任何文件目录!')
  32.                 continue
  33.             break
  34.         
  35.         # 启动筛选程序
  36.         return self.start(_dir)
  37.    
  38.     # 获取文件MD5
  39.     def get_file_md5(self,file_path):
  40.         with open(file_path, 'rb') as file:
  41.             for each_time in range(3000):
  42.                 data = file.read(1024)  #将文件分块读取
  43.                 if not data:
  44.                     break
  45.                 self.md5.update(data)
  46.         return self.md5.hexdigest()
  47.    
  48.     # 比对MD5
  49.     def compare_md5(self,file_path):
  50.         self.md5 = hashlib.md5()
  51.         file_md5 = self.get_file_md5(file_path)
  52.         file_size = str(getsize(file_path))
  53.         # 提取相同的文件
  54.         repeat_file = self.all_file.get(file_md5+file_size)
  55.         
  56.         # 如果提取到了相同的文件
  57.         if repeat_file:
  58.             # 刷新主窗口
  59.             self.ui.thread_show(str(self.all_file[file_md5+file_size])+','+str(file_path)+'\n')
  60.             # 将两个文件的路径写入txt
  61.             with open(os_join(expanduser('~'),'Desktop\\重复的文件.txt'),'at',encoding='utf8') as result_file:
  62.                 result_file.write(str(self.all_file[file_md5+file_size])+','+str(file_path)+'\n')
  63.             # 记录重复的文件的路径
  64.             self.all_repeat_file.append(file_path)

  65.         # 如果没有提取到相同的文件
  66.         else:
  67.             # 记录非重复文件的路径
  68.             self.all_file[file_md5+file_size] = file_path

  69.     def start(self,dirs):
  70.         # 刷新主窗口
  71.         print(f'线程{self.sign}:正在清理重复文件中。。。')
  72.         # 刷新主窗口
  73.         print(f'线程{self.sign}:开始清理重复文件!')
  74.         
  75.         # 删除旧的txt
  76.         try:remove(os_join(expanduser('~'),'Desktop\\重复的文件.txt'))
  77.         except:pass
  78.         
  79.         # 开始效验文件
  80.         for each_dir in dirs:
  81.             for each_path in os_walk(each_dir):
  82.                 for each_file in each_path[2]:
  83.                     self.compare_md5(each_path[0]+sep+each_file)
  84.                     del self.md5
  85.                     
  86.         # 清理内存
  87.         del self.all_file
  88.         
  89.         # 如果找到了重复的文件
  90.         if len(self.all_repeat_file):
  91.             while True:
  92.                 # 请求回复
  93.                 response =  input(f'线程{self.sign}:发现{len(self.all_repeat_file)}个重复的文件,是否删除?【Y\\N】【详情请查看‘桌面\重复的文件.txt】')
  94.                 # 删除重复的文件
  95.                 if response.casefold() == 'y':
  96.                     for each_path in self.all_repeat_file:
  97.                         remove(each_path)
  98.                     return '重复文件清除完成!'

  99.                 # 操作被取消
  100.                 elif response.casefold() == 'n':
  101.                     return '操作被取消!'

  102.                 # 返回了错误的输入
  103.                 else:
  104.                     self.ui.ai_show(f'线程{self.sign}:输入数据错误!')
  105.         else:
  106.             return '没有发现重复的文件!'

  107. def main(args,sign=1):
  108.     exec(f'deleter{sign} = Delete_Repeat_File(sign)')
  109.     return eval(f'deleter{sign}.main()')
  110.    
  111. if __name__ == '__main__':
  112.     deleter = Delete_Repeat_File()
  113.     deleter.main()


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

使用道具 举报

发表于 2020-8-8 17:31:42 | 显示全部楼层

回帖奖励 +1 鱼币

不着急,先让我仔细看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-8 17:44:52 | 显示全部楼层    本楼为最佳答案   
这是我写的通过效验文件抽样MD5和文件大小的程序,稍微改了改,给你用吧。
代码:
  1. import hashlib
  2. from os import walk as os_walk
  3. from os import sep,remove
  4. from os.path import getsize,expanduser
  5. from os.path import join as os_join
  6. import easygui

  7. class Delete_Repeat_File:
  8.     def __init__(self,sign=1):
  9.         self.sign = sign

  10.         # 所有遍历到的文件(不包括重复文件)
  11.         self.all_file = {}
  12.         
  13.         # 所有重复文件
  14.         self.all_repeat_file = []
  15.         
  16.     def main(self):
  17.         # 刷新主窗口
  18.         while True:
  19.             file = easygui.diropenbox(f'线程{self.sign}:请选择将要清理的文件夹。')
  20.             
  21.             # 返回-1表示取消操作
  22.             if file == -1:
  23.                 return '操作被取消!'
  24.             
  25.             # 集合目录
  26.             _dir = []
  27.             _dir.extend(file)

  28.             
  29.             # 如果所选文件里没有目录
  30.             if not _dir:
  31.                 print(f'线程{self.sign}:未指定任何文件目录!')
  32.                 continue
  33.             break
  34.         
  35.         # 启动筛选程序
  36.         return self.start(_dir)
  37.    
  38.     # 获取文件MD5
  39.     def get_file_md5(self,file_path):
  40.         with open(file_path, 'rb') as file:
  41.             for each_time in range(3000):
  42.                 data = file.read(1024)  #将文件分块读取
  43.                 if not data:
  44.                     break
  45.                 self.md5.update(data)
  46.         return self.md5.hexdigest()
  47.    
  48.     # 比对MD5
  49.     def compare_md5(self,file_path):
  50.         self.md5 = hashlib.md5()
  51.         file_md5 = self.get_file_md5(file_path)
  52.         file_size = str(getsize(file_path))
  53.         # 提取相同的文件
  54.         repeat_file = self.all_file.get(file_md5+file_size)
  55.         
  56.         # 如果提取到了相同的文件
  57.         if repeat_file:
  58.             # 刷新主窗口
  59.             self.ui.thread_show(str(self.all_file[file_md5+file_size])+','+str(file_path)+'\n')
  60.             # 将两个文件的路径写入txt
  61.             with open(os_join(expanduser('~'),'Desktop\\重复的文件.txt'),'at',encoding='utf8') as result_file:
  62.                 result_file.write(str(self.all_file[file_md5+file_size])+','+str(file_path)+'\n')
  63.             # 记录重复的文件的路径
  64.             self.all_repeat_file.append(file_path)

  65.         # 如果没有提取到相同的文件
  66.         else:
  67.             # 记录非重复文件的路径
  68.             self.all_file[file_md5+file_size] = file_path

  69.     def start(self,dirs):
  70.         # 刷新主窗口
  71.         print(f'线程{self.sign}:正在清理重复文件中。。。')
  72.         # 刷新主窗口
  73.         print(f'线程{self.sign}:开始清理重复文件!')
  74.         
  75.         # 删除旧的txt
  76.         try:remove(os_join(expanduser('~'),'Desktop\\重复的文件.txt'))
  77.         except:pass
  78.         
  79.         # 开始效验文件
  80.         for each_dir in dirs:
  81.             for each_path in os_walk(each_dir):
  82.                 for each_file in each_path[2]:
  83.                     self.compare_md5(each_path[0]+sep+each_file)
  84.                     del self.md5
  85.                     
  86.         # 清理内存
  87.         del self.all_file
  88.         
  89.         # 如果找到了重复的文件
  90.         if len(self.all_repeat_file):
  91.             while True:
  92.                 # 请求回复
  93.                 response =  input(f'线程{self.sign}:发现{len(self.all_repeat_file)}个重复的文件,是否删除?【Y\\N】【详情请查看‘桌面\重复的文件.txt】')
  94.                 # 删除重复的文件
  95.                 if response.casefold() == 'y':
  96.                     for each_path in self.all_repeat_file:
  97.                         remove(each_path)
  98.                     return '重复文件清除完成!'

  99.                 # 操作被取消
  100.                 elif response.casefold() == 'n':
  101.                     return '操作被取消!'

  102.                 # 返回了错误的输入
  103.                 else:
  104.                     self.ui.ai_show(f'线程{self.sign}:输入数据错误!')
  105.         else:
  106.             return '没有发现重复的文件!'

  107. def main(args,sign=1):
  108.     exec(f'deleter{sign} = Delete_Repeat_File(sign)')
  109.     return eval(f'deleter{sign}.main()')
  110.    
  111. if __name__ == '__main__':
  112.     deleter = Delete_Repeat_File()
  113.     deleter.main()


复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-8 22:12:58 | 显示全部楼层
陈尚涵 发表于 2020-8-8 17:31
不着急,先让我仔细看看

好的大佬 你先研究一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-8 22:14:02 | 显示全部楼层
nahongyan1997 发表于 2020-8-8 17:44
这是我写的通过效验文件抽样MD5和文件大小的程序,稍微改了改,给你用吧。
代码:

感谢 大神太厉害了 膜拜!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-9 11:46:11 | 显示全部楼层
yrhhh 发表于 2020-8-8 22:14
感谢 大神太厉害了 膜拜!

我的最佳尼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-9 19:07:50 | 显示全部楼层

不好意思 老哥 忘记了 昨天先试验了一下 但是不太会用 请问在哪里填我文件夹的路径呐
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-9 20:14:18 | 显示全部楼层
有文件夹选择框啊,你把所有图片放到一个文件夹,然后选择那个文件夹,他就会检测重复文件,然后提示你是否删除,重复的文件路径保存在桌面了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-9 22:08:18 | 显示全部楼层
nahongyan1997 发表于 2020-8-9 20:14
有文件夹选择框啊,你把所有图片放到一个文件夹,然后选择那个文件夹,他就会检测重复文件,然后提示你是否 ...

老哥 你说的和我的是一个意思吗 我的不是检测一个文件夹的重复文件 是两个文件夹
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-10 07:40:11 | 显示全部楼层
本帖最后由 nahongyan1997 于 2020-8-10 07:41 编辑

那你得改改,我这个是我软件的一部分,在我这是可以选很多个文件夹的,但是拆出来就不能用了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-10 09:30:31 | 显示全部楼层
nahongyan1997 发表于 2020-8-10 07:40
那你得改改,我这个是我软件的一部分,在我这是可以选很多个文件夹的,但是拆出来就不能用了。

好的好的 感谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 12:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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