使用python代码从目录和子目录中删除重复的文件

时间:2015-08-10 12:05:42

标签: python

我正在尝试遍历目录和子目录以查找重复文件,但此处遇到的问题是脚本出现了一些错误:

Traceback (most recent call last):
  File "./fileDupchknew.py", line 29, in <module>
    dup_fileremove(dirname)
  File "./fileDupchknew.py", line 26, in dup_fileremove
    os.remove(filepath)
  OSError: [Errno 21] Is a directory: '/tmp/rishabh-test/new-test'

脚本:

#!/usr/bin/python
import os
import hashlib
import sys


dirname = sys.argv[1] os.chdir(dirname)

 def dup_fileremove(dir):
    duplicate = set()
    os.chdir(dir)
    path=os.getcwd()
    print ("The dir is: ", path)
    for filename in os.listdir(dir):
        filehash = None
        filepath=os.path.join(dir, filename)
        print("Current file path is: ", filepath)
        if os.path.isdir(filepath):
            dup_fileremove(filepath)
        elif os.path.isfile(filepath):
            filehash =hashlib.md5(file(filepath).read()).hexdigest()
        if filehash not in duplicate:
            duplicate.add(filehash)
        else:
            os.remove(filepath)
            print("removed : ", filepath)

dup_fileremove(dirname)

2 个答案:

答案 0 :(得分:1)

你真的很幸运,你收到了这条错误消息,否则你的代码会删除目录!

问题是控制从递归调用返回到

之后

__weak typeof(self) weakSelf = self;

然后继续

dup_fileremove(filepath)

你不想要那个!

解决此问题的一种简单方法是在if filehash not in duplicate:之后添加continue语句。

但更好的解决方法是缩进dup_fileremove(filepath)内容,使其与if filehash not in duplicate:行对齐。

例如:

filehash = hashlib.md5(file(filepath).read()).hexdigest()

我没有测试过您修改过的代码版本。 看起来确定,但我不保证。 :)

BTW,建议不要直接使用#!/usr/bin/python import os import hashlib import sys def dup_fileremove(dirname): duplicate = set() os.chdir(dirname) path=os.getcwd() print ("The dirname is: ", path) for filename in os.listdir(dirname): filehash = None filepath=os.path.join(dirname, filename) print("Current file path is: ", filepath) if os.path.isdir(filepath): dup_fileremove(filepath) elif os.path.isfile(filepath): filehash =hashlib.md5(file(filepath).read()).hexdigest() if filehash not in duplicate: duplicate.add(filehash) else: os.remove(filepath) print("removed : ", filepath) dirname = sys.argv[1] os.chdir(dirname) dup_fileremove(dirname) 类打开文件。在Python 3中,file()不再存在,但即使在Python中,文档也建议使用file()函数,因为至少Python 2.5,如果不是更早的话。

答案 1 :(得分:1)

由于您不想删除目录(可以从相关评论中看到) -

  

不,我不想删除目录

如果出现以上情况,则会出现问题,因为您没有为目录创建filehash。因为当您没有为目录创建文件共享时,您将文件共享为None,而对于第一个目录,None集中不存在duplicates,因此它会添加{ {1}}到集合。从下一个目录开始,它会发现None中已存在None,因此会尝试在其上使用set()导致问题。

一个简单的解决方法是在尝试删除之前以及添加到set之前检查os.remove()是否为filehash。示例 -

None