使用 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_path
或 root_dir_path
(因为它是一个目录和它的完整路径)。
我有几个文件夹,其中包含名称略有不同的重复文件(例如 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_path
或 root_dir_path
(因为它是一个目录和它的完整路径)。