虽然循环永远不会停止,甚至设置一个错误的哨兵



我写了一个程序来查找大小>= 100Mb的大文件,
但是它在MacOS上运行无穷无尽

我设置

sentinel = True
while sentinel:

和断裂条件:

sentinel = False

完整代码:

import os, time, shelve, logging
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s")
logging.info("Start of Program")
start = time.time()
root = '/'
# errors= set()
# dirs = set()
sentinel = True
while sentinel:
try:
root = os.path.abspath(root) #ensure its a abspath
#set the baseline as 100M 
#consider the shift
baseline = 100 * 2**20  # 2*20 is 1M
#setup to collect the large files
large_files = []
#root is a better choise as the a concept
for foldername, subfolders, files in os.walk(root):
# logging.error("foldername: %s" %foldername)
# print("subfolders: ", subfolders)
for f in files:
# print(f"{foldername}, {f}")
abspath = os.path.join(foldername, f)
logging.debug("abspath: %s" %abspath)
size = os.path.getsize(abspath)
if size >= baseline:
large_files.append((os.path.basename(abspath), size/2**20))
# turn_end = time.time()
# print(f"UnitTimer: {turn_end-start}") #no spaces beween .
#write the large files to shelf
logging.debug("subfolders: " + str(subfolders))
shelf = shelve.open('large_files')
shelf.clear()
shelf["large_files"] = large_files
shelf.close()
end = time.time()
logging.debug("Timer: %s." %(end-start))
#break the while loop
logging.info("End of Program")
#break the loop after walk()
sentinel = False
except (PermissionError,FileNotFoundError) as e:
# errors.add(e)
pass

代码无休止地运行,但我找不到问题所在。

仅当没有异常时,哨兵才设置为False。确保在except块中也将其设置为False

要从错误中正常恢复,您可能不希望将每个文件访问包装在同一个 try/except 块中。相反,您希望有一个小的try/except 块捕获单个文件操作,如果失败,您可以应用错误处理代码(例如重试或日志记录并继续下一个文件(。

最新更新