2016-11-21 15 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