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')
Поэтому, прежде чем он получит размер, он проверяет, действительно ли файл существует, следуя всем ссылкам, чтобы убедиться, что он существует. Родственный ТАК пост.