Найти большие_файлы, но вывести неожиданные результаты - PullRequest
0 голосов
/ 28 августа 2018

У меня есть такая программа для поиска больших файлов

import os, time, shelve
start = time.time()
root = '/'
# errors= set()
# dirs = set()
while True:
    try:
        root = os.path.abspath(root) #ensure its a abspath
        #set the baseline as 100M 
        #consider the shift
        baseline = 100 * 2**20  # 2*20 is1M
        #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):
            for f in files:
                # print(f"{foldername}, {f}")
                abspath = os.path.join(foldername, f)
                size = os.path.getsize(abspath)
                if size >= baseline:
                    large_files.append((os.path.basename(abspath), size))
                    print(abspath, size/(2**20))

        #write the large files to shelf
        shelf = shelve.open('/root/large_files.db')
        shelf["large_files"] = large_files
        shelf.close()

        if subfolders == []:
            end = time.time()
            break

    except (PermissionError,FileNotFoundError) as e:
        # errors.add(e)
        pass

Он последовательно выдает одинаковые результаты

[root@iz2ze9wve43n2nyuvmsfx5z ~]# python3 search_large_files.py 
/dev/core 134217726.0078125
/dev/core 134217726.0078125
/dev/core 134217726.0078125
....

Однако я не нашел причин, по которым

 print(abspath, size/(2**20))

будет делать это постоянно.

В чем проблема может быть в моем коде:

1 Ответ

0 голосов
/ 28 августа 2018

У вас есть бесконечный внешний цикл с while True:, и, очевидно, /dev/core - единственный файл в вашей файловой системе, размер которого превышает размер, указанный в baseline, поэтому он будет выводить один и тот же файл снова и снова.

Удалите while True: и снимите отступ внутри блока, и ваш код будет работать.

Обратите внимание, что ваше условие if subfolders == []: находится вне цикла for foldername, subfolders, files in os.walk(root): и поэтому не будет полезным. В любом случае вы должны безоговорочно записать время окончания, поэтому вам нужно просто удалить условие if и оператор break.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...