Найти большие_файлы, но вывести неожиданные результаты

1

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

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))

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

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

Теги:
centos

1 ответ

1
Лучший ответ

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

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

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

  • 0
    Я ввел «while True», потому что, если запустить его на MacOS, чтобы встретить «PermissionError», коды сломаются.
  • 1
    Я вижу, но все while True: делает, это пытается повторить то же самое, что, я думаю, не поможет ошибке разрешения, которую он получает в первой итерации. Вы должны найти основную причину ошибки разрешения и либо избегать доступа к проблемным файлам / папкам, либо разрешить процессу иметь надлежащие права доступа к этим файлам / папкам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню