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

Find and remove duplicate files using Python

我有几个文件夹,其中包含名称略有不同的重复文件(例如 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)

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

试试这个:

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(因为它是一个目录和它的完整路径)。