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

2024-10-01 17:24:25 发布

您现在位置: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'

脚本:

^{pr2}$

Tags: 文件inpytest目录脚本most错误
2条回答

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

问题是after control从递归调用返回

dup_fileremove(filepath)

然后继续

if filehash not in duplicate:

你不想那样!在

解决这个问题的一个简单方法是在dup_fileremove(filepath)后面放一个continue语句。在

但是一个更好的方法是缩进if filehash not in duplicate:内容,使其与filehash = hashlib.md5(file(filepath).read()).hexdigest()行对齐。在

例如:

#!/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)

我还没有测试你代码的这个修改版本。它看起来很好,但我不能保证。:)

顺便说一句,建议不要直接使用file()类来打开文件。在python3中,file()已经不存在了,但是即使在Python中,文档至少从python2.5(如果不是更早的话)就建议使用open()函数。在

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

No i don't want to delete directories

如果是上述情况,则会出现问题,因为您没有为目录创建filehash。因为当您不为目录创建一个filehash时,您得到的filehash是None,而对于第一个目录,None不在{}集中,所以它会将None添加到集合中。从下一个目录开始,它发现None已经存在于set()中,因此它试图在其上使用os.remove(),从而导致问题。在

一个简单的修复方法是在尝试删除和添加到集合之前检查filehash是否是{}。示例-

#!/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 is not None and filehash not in duplicate:
            duplicate.add(filehash)
        elif filehash is not None:
            os.remove(filepath)
            print("removed : ", filepath)

dup_fileremove(dirname)

相关问题 更多 >

    热门问题