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

Почему вы считаете, что это бесконечная петля, а не длинная операция вычисления? сколько у вас файлов в этих каталогах? – 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 s снова, что дает неверное представление о бесконечном цикле.

Попробуйте удалить 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

Отлично, это сработало, я просто избавился от строки «для имени в тире:» из моего кода. – GridP

+1

Добро пожаловать. Я рад помочь. Поскольку вы все еще новичок здесь, могу ли я указать, что предпочтительный способ сказать «спасибо» здесь - это хорошие вопросы и полезные ответы (когда у вас достаточно репутации, чтобы это сделать) и приняв самый полезный ответ на любой интересующий вас вопрос (что также дает небольшой импульс вашей репутации). – e4c5

+0

Да, конечно, я повторю попытку позже, так как моя текущая репутация не позволяет мне выкачивать на данный момент. – GridP

Смежные вопросы