Errno 2 при использовании os.walk в Python

Это скрипт для поиска файлов, размер которых превышает заданный размер:

def size_scan(folder, size=100000000):
    """Scan folder for files bigger than specified size

    folder: abspath
    size: size in bytes
    """
    flag = False

    for folder, subfolders, files in os.walk(folder):
        # skip 'anaconda3' folder
        if 'anaconda3' in folder:
            continue

        for file in files: 
            file_path = os.path.join(folder, file)
            if os.path.getsize(file_path) > size:
                print(file_path, ':', os.path.getsize(file_path))
                flag = True

    if not flag:
        print('There is nothing, Cleric')

При сканировании корневой папки в Linux я получаю следующее сообщение об ошибке:

Traceback (most recent call last):

  File "<ipython-input-123-d2865b8a190c>", line 1, in <module>
    runfile('/home/ozramsay/Code/sizescan.py', wdir='/home/ozramsay/Code')

  File "/home/ozramsay/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 880, in runfile
    execfile(filename, namespace)

  File "/home/ozramsay/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "/home/ozramsay/Code/sizescan.py", line 32, in <module>
    size_scan('/')

  File "/home/ozramsay/Code/sizescan.py", line 25, in size_scan
    if os.path.getsize(file_path) > size:

  File "/home/ozramsay/anaconda3/lib/python3.6/genericpath.py", line 50, in getsize
    return os.stat(filename).st_size

FileNotFoundError: [Errno 2] No such file or directory: '/run/udev/link.dvdrw'

Я догадался, что это потому, что интерпретатор Python не может сканировать сам себя, поэтому я попытался пропустить папку "anaconda3" из поиска (помеченной как #skip папка anaconda в приведенном выше коде). Однако сообщение об ошибке осталось прежним.

Кто-нибудь может объяснить, пожалуйста?

(Пожалуйста, дайте мне знать, если такие вопросы не разрешены здесь и должны быть отредактированы. Спасибо)

1 ответ

Решение

Файл python пытается получить размер с os.stat(filename).st_size неработающая ссылка Неработающая ссылка - это ссылка с удаленной целью. Это очень похоже на интернет-ссылку, которая дает 404. Чтобы исправить это в вашем скрипте, проверьте, является ли это файл (предпочтительно), или используйте try/catch (не желательно). Чтобы проверить, является ли файл файлом, а не битой ссылкой, используйте os.path.isfile(file_path), Ваш код должен выглядеть так:

def size_scan(folder, size=100000000):
"""Scan folder for files bigger than specified size

folder: abspath
size: size in bytes
"""
flag = False

for folder, subfolders, files in os.walk(folder):
    # skip 'anaconda3' folder
    if 'anaconda3' in folder:
        continue

    for file in files: 
        file_path = os.path.join(folder, file)
        if os.path.isfile(file_path) and (os.path.getsize(file_path) > size):
            print(file_path, ':', os.path.getsize(file_path))
            flag = True

if not flag:
    print('There is nothing, Cleric')

Поэтому, прежде чем он получит размер, он проверяет, действительно ли файл существует, следуя всем ссылкам, чтобы убедиться, что он существует. Родственный ТАК пост.

Другие вопросы по тегам