下面给出了一个函数,用于返回其参数大小的总和,可以是单个文件/目录或文件/目录列表。代码给出了错误消息RuntimeError: maximum recursion depth exceeded while calling a Python object
但是我尝试测试它。
如何解决这个问题?
由于
苏雷什
#!/usr/bin/python3.1
import os
def fileSizes(f):
if hasattr(f,'__iter__'):
return sum(filter(fileSizes,f))
if os.path.isfile(f):
return os.path.getsize(f)
elif os.path.isdir(f):
total_size = os.path.getsize(f)
for item in os.listdir(f):
total_size += fileSizes(os.path.join(f, item))
return total_size
答案 0 :(得分:8)
使用内置的os.walk
(Documentation)方法,而不是编写自己的adhoc目录 - 横向方法。
事实上,文档中的示例(上面的链接)计算了非目录文件的总大小。
答案 1 :(得分:2)
上次检查时,默认的最大递归深度为1000.您有几个选项:
sys.setrecursionlimit
设置最大递归限制。请注意,如果滥用,可能会导致分段错误。答案 2 :(得分:1)
有许多技巧可以避免深度递归问题,但我怀疑这不是你的核心问题。 (也许是因为你有非常深的目录结构..所以首先在浅层目录上进行测试。)
我猜你在链接引起的目录树中找到了一个循环结构。 即符号链接目录,指向父目录。 (这种结构并不罕见)。
通过在跟踪目录之前检查目录是否为符号链接,可以避免无限循环。
另一个可能性就是你得到了“。”或“..”在您的列表中的某个地方。这些也会产生无限循环。我没有看到这里发生的事情,但值得思考。 os.listdir
似乎没有归还它们。
答案 3 :(得分:1)
问题在于:
if hasattr(f,'__iter__'):
return sum(filter(fileSizes,f))
由于f
是一个路径,因此它是一个字符串,并且它具有属性__iter__
,因此您可以无限循环。