确定文件大小时的Python无限循环

Posted

技术标签:

【中文标题】确定文件大小时的Python无限循环【英文标题】:Python infinite loop while determining the file size 【发布时间】:2016-11-21 14:14:46 【问题描述】:

我在尝试确定驱动器中文件夹的大小时遇到​​了无限循环。这是我正在使用的代码,

import os
from os.path import join, getsize
from sys import exit

filepath="P:\\GIS\\Data"

dirList=os.listdir(filepath)

for fname in dirList:   
    for root, dir, files in os.walk(filepath):

        print  root , sum([getsize(join(root, name)) for name in files]),
        print  "bytes in", len(files), "non-directory files"


print "All finished!"

我已尝试将结果保存在变量中,但循环甚至没有到达该步骤并开始无限循环请您告诉我哪里出了问题?

【问题讨论】:

它循环播放什么?你能看到文件何时开始重复吗? 印刷品应该是第二个循环的一部分吗? 为什么你认为它是无限循环而不是长时间的计算操作?您在这个目录中有多少个文件? 我可能是错的,但我不认为你是无限循环的。我认为你在重复自己。我认为你想要 `for root, dir, files in os.walk(fname)' 虽然你可能希望在 try except 块中捕获它是否是一个文件 知道您的任何目录中是否存在指向其上方目录的符号链接?这是我看到你陷入循环的唯一方法,但我不确定os.walk 是否默认遵循符号链接。 【参考方案1】:

由于os.walk,不太可能是无限循环或递归,因为

默认情况下,walk() 不会进入解析的符号链接 到目录。将 followlinks 设置为 True 以访问指向的目录 通过符号链接,在支持它们的系统上。

但是您确实有一个嵌套循环,这可能会造成您的代码是无限循环的印象。

你可以简化它来避免嵌套循环

for root, dir, files in os.walk("P:\\GIS\\Data"):

    print  root , sum([getsize(join(root, name)) for name in files]),
    print  "bytes in", len(files), "non-directory files"

我相信这会产生预期的结果。

【讨论】:

太好了,这行得通,我刚刚从我的代码中删除了 'for name in dirlist:' 行。 不客气。我很高兴能帮上忙。由于您还是新手,我可以指出,在这里说“谢谢”的首选方式是投票赞成好的问题和有用的答案(一旦您有足够的声誉这样做),并接受最有用的答案回答您提出的任何问题(这也会稍微提升您的声誉)。 肯定会,我会稍后再试,因为我目前的声誉不允许我现在投票。【参考方案2】:
filepath="P:\\GIS\\Data"

dirList=os.listdir(filepath)

for fname in dirList:   
    for root, dir, files in os.walk(filepath):

您想遍历"P:\\GIS\\Data" 中的每个目录树,这就是您在第二个循环中所做的。但是,您为此目录中的每个目录都这样做,因为您首先迭代dirList,而您甚至没有使用fname

因此,对于dirList 中的每个目录,您都重复相同的prints,这会给您带来无限循环的错误印象。

尝试删除for fname in dirList:,您的脚本应该会结束。

【讨论】:

以上是关于确定文件大小时的Python无限循环的主要内容,如果未能解决你的问题,请参考以下文章

覆盖 initWithCoder 时的无限循环

为啥我的代码在执行时的初始嵌套 for 循环中进入无限循环?

构造链表时的无限循环

Apache Spark:从IDE远程运行作业时的无限循环

在JavaScript中构建mergesort时的无限循环

在 componentWillReceiveProps 中调度时的无限循环