[英]Python: maximum recursion depth
下面給出了一個函數,用於返回其參數大小的總和,可以是單個文件/目錄或文件/目錄列表。 代碼給出了一個錯誤消息RuntimeError: maximum recursion depth exceeded while calling a Python object
時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
而不是編寫自己的adhoc目錄 - 橫向方法,而是使用內置的os.walk
(Documentation)方法。
實際上,文檔中的示例(上面的鏈接)計算非目錄文件的總大小。
上次我檢查時,默認的最大遞歸深度為1000.您有幾個選項:
sys.setrecursionlimit
設置最大遞歸限制。 請注意,如果濫用此功能,可能會導致分段錯誤。 有許多技巧可以避免深度遞歸問題,但我懷疑這不是你的核心問題。 (也許是因為你有非常深的目錄結構..所以首先在淺層目錄上進行測試)。
我猜你在鏈接引起的目錄樹中找到了一個循環結構。 即符號鏈接的目錄,指向父目錄。 (這種結構並不罕見)。
您可以通過在跟蹤目錄之前檢查目錄是否為符號鏈接來避免無限循環。
另一個可能性就是你得到了“。” 或“..”在您的列表中的某個地方。 這些也會產生無限循環。 我沒有看到這里發生的事情,但值得思考。 os.listdir
似乎沒有返回它們。
問題在於:
if hasattr(f,'__iter__'):
return sum(filter(fileSizes,f))
由於f
是一個路徑,它是一個字符串,它具有__iter__
屬性,所以你無限循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.