代码之家  ›  专栏  ›  技术社区  ›  Nic

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

  •  -1
  • Nic  · 技术社区  · 7 年前

    我有几个文件夹,其中包含名称稍有不同的重复文件(例如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 然而,这似乎比我需要的要复杂得多。

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

    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 回复  |  直到 7 年前
        1
  •  3
  •   Alfe    7 年前

    试试这个:

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

    推荐文章