【问题标题】:Find and remove duplicate files using Python使用 Python 查找和删除重复文件
【发布时间】:2019-02-08 13:10:18
【问题描述】:

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

【问题讨论】:

  • 使用os.path.join
  • 如果文件包含 (1),为什么不只是 os.remove(os.path.join(file_path,file)?为什么索引和所有???
  • 'r"%s' %file_path+"'\'"+file+'"' 在文件路径中嵌入原始前缀 ...
  • 我建议列出所有文件(使用os.walk() 得到这个),然后按大小对所有文件进行排序,然后线性遍历这个列表,识别双打(在这个列表)和yield 每个这样的双组(即一个小的文件列表(通常只有两个),它们是相同的)。当然,您应该检查这几个文件的内容,然后确保不只是其中两个意外地大小相同而不相同。如果您确定您有一组相同的名称,请删除名称最简单的名称(例如带有后缀 (1) 等)。

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


【解决方案1】:

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

试试这个:

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

【讨论】:

    猜你喜欢
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2016-11-03
    • 2019-08-28
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    相关资源
    最近更新 更多