2016-11-21 123 views
1

我试图确定驱动器中的文件夹的大小,结束了无限循环。下面是我使用的代码,Python无限循环,同时确定文件大小

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!" 

我试图将结果保存在一个变量,但循环甚至没有达到这一步,开始无限循环能不能请您告诉我往哪里去了?

+0

它循环了什么?你可以看到文件何时开始重复? – Hoopdady

+0

打印是否应该是第二个循环的一部分? –

+0

为什么你认为它是无限循环而不是长时间运算?你有多少文件在这个dirs中? – Pax0r

回答

0
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每个目录,你做同样的print一切都结束了一遍,它给你一个无限循环的错误印象。

尝试删除for fname in dirList:并且您的脚本应该达到其结尾。

+0

是的,谢谢你,这是非常有益的! – GridP

0

这是不太可能无限循环或递归因为os.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" 

这一点,我相信会产生期望的结果。

+0

这很好,这工作,我刚刚从我的代码中删除'在dirlist:'的名字。 – GridP

+1

非常欢迎。我很高兴得到了帮助。既然你在这里还是新手,我是否可以指出在这里说'感谢'的首选方式是通过提高投票的好问题和有用的答案(一旦你有足够的声望这样做),并接受最有帮助的答案到任何问题你问(这也给你一个小小的提升你的声誉)。 – e4c5

+0

是的,我会再试一次,因为我目前的声望不允许我在此时投票。 – GridP