我正在尝试遍历目录和子目录以查找重复文件,但此处遇到的问题是脚本出现了一些错误:
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)
答案 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