2016-09-22 5 views
0

Я прочитал много вопросов с этой проблемой, но я заметил, что это происходит по многим причинам и не нашел ответа на мой особая проблема. Дело в том, что я случайно удалил несколько файлов и использовал photorec, чтобы попытаться восстановить их (я на Ubuntu 16.04 Xenial). Проблема в том, что он восстановил 2600 + папок! Я пишу немного filecrawler, чтобы избавиться от файлов, которые мне не нужны. Единственные файлы, которые меня интересуют, - это .py, .jpg, .png и .mp3. Вот код для моего искателя:Python - OSError: [Errno 2] Нет такого файла или каталога

import os 

path= 

for (path, dirs, files) in os.walk(path): 
    for name in files: 
     if name.endswith('.py') or name.endswith('.jpg') or name.endswith('.png') or name.endswith('.mp3'): 
      continue 
     else: os.remove(name) 

Я определяю «путь» вручную, и я сделал тест, где я печатаю часть путей, директорий и файлов, а также печатает то, что я хочу. Однако при выполнении приведенного ниже кода он возвращает:

OSError: [Errno 2] No such file or directory: 'f0272560.java' 

Который я предполагаю, это первый файл, который я пытаюсь удалить. Я предполагаю, что он ищет файл снова, после того как он был удален уже. Имеет ли это смысл или это что-то еще вызывает ошибку? Как я могу это исправить?

Заранее благодарен!

+1

Вы передаете только голое имя файла 'os.remove()'. Вы должны передать полный путь. –

ответ

1

fileslistyield ed os.walk - это безусловные названия файлов. Если они не находятся в рабочем каталоге, os.remove не может удалить их с помощью неквалифицированных имен, поскольку он не знает, где их найти. Изменение:

os.remove(name) 

в

os.remove(os.path.join(path, name)) 

так что вы пройти определенный путь к файлу, а не только его имя.

Побочное Примечание: В то время как это работает хорошо, если вам не нужно оригинальное определение path, переписав его с петлей за path от os.walk может привести к путанице. Возможно, вы захотите изменить имя одного из них, либо изменив верхний уровень на rootdir, либо изменив имя переменной цикла на что-то еще (например, curdir).

+0

Спасибо большое! Мне было непонятно, как правильно использовать os.walk – DarthDante

+0

@DarthDante: Yar, 'os.listdir' запутан по тем же причинам. Для 'os.listdir', я рекомендую заменить его на' os.scandir' (3.5 или выше только печально: pre-3.5, вам нужен пакет PyPI 'scandir' для использования эквивалентного' scandir.scandir'), где возвращаемые записи имеют атрибут '.name' для голого имени и' .path' для квалифицированного пути; для 'os.walk', это не страшная идея, чтобы первые две строки внутри цикла' walk' были 'qdirs = [os.path.join (путь, d) для d в dirs]', 'qfiles = [ os.path.join (путь, f) для f в файлах] ', так что вы можете итерировать' qdirs'/'qfiles' для предварительно определенных путей. – ShadowRanger

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