使用Python查找和删除重复文件

时间:2019-02-08 13:10:18

标签: python python-2.7 file-management data-management

我有几个文件夹,其中包含名称略有不同的重复文件(例如file_abc.jpg,file_abc(1).jpg)或后缀“(1)”的后缀。我试图开发一个相对简单的文件搜索文件夹,识别重复项然后删除它们的方法。重复项的条件是文件末尾的“(1)”,只要原始文件也存在。

我可以识别重复的行,但是我无法以正确的格式创建文本字符串以删除它们。它必须为"C:\Data\temp\file_abc(1).jpg",但是使用下面的代码我最终得到的是r"C:\Data\temp''file_abc(1).jpg"

我已经看过答案[Finding duplicate files and removing them,但这似乎比我需要的要复杂得多。

如果有更好的(+简单)方法可以做到这一点,那么我让我知道,但是我在50个奇数文件夹中总共只有大约10,000个文件,因此没有大量数据可以处理。

到目前为止,我的代码是:

import os

file_path = r"C:\Data\temp"
file_list = os.listdir(file_path)
print (file_list)

for file in file_list:
    if ("(1)" in file):
    index_no = file_list.index(file)
    print("!! Duplicate file, number in list: "+str(file_list.index(file)))
    file_remove = ('r"%s' %file_path+"'\'"+file+'"')
    print ("The text string is: " + file_remove)
    os.remove(file_remove)

1 个答案:

答案 0 :(得分:2)

您的代码只是比必要的要复杂一点,并且您没有应用正确的方法从路径和文件名中创建文件路径。而且我认为您不应该删除没有原始文件的文件(即虽然名称看起来并不重复的文件)。

尝试一下:

for file_name in file_list:
    if "(1)" not in file_name:
        continue
    original_file_name = file_name.replace('(1)', '')
    if not os.path.exists(os.path.join(file_path, original_file_name):
        continue  # do not remove files which have no original
    os.remove(os.path.join(file_path, file_name))

请注意,这对于其中多次出现(1)的文件无法正常工作,而编号为(2)或更高的文件也根本无法处理。所以我真正的主张是这样:

  • 在给定的开始位置下方列出整个目录树中的所有文件(使用os.walk()来获得),然后
  • 按大小排序所有文件,然后
  • 线性遍历此列表,确定双打(此列表中的邻居)并
  • 产生每个这样的双组(即,一小部分相同的文件(通常只有两个))。

当然,您应该检查这几个文件的内容,然后确保不只是其中两个文件大小相同而没有相同。如果您确定有一组完全相同的名称,请删除名称最简单的一组(例如,不带后缀(1)等的所有文字)。


顺便说一句,我会称呼file_path之类的dir_pathroot_dir_path(因为它是一个目录及其完整路径)。