Удалить все файлы в каталоге

26

Попытка удалить все файлы в определенном каталоге дает мне следующую ошибку:

OSError: [Errno 2] No such file or directory: '/home/me/test/*'

Код, который я запускаю:

import os
test = "/home/me/test/*"
os.remove(test)
Теги:

10 ответов

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

os.remove() не работает в каталоге, а os.rmdir() работает только в пустом каталоге. И Python не будет автоматически расширять "/home/me/test/*", как это делают некоторые оболочки.

Однако вы можете использовать shutil.rmtree() в каталоге, чтобы сделать это.

import shutil
shutil.rmtree('/home/me/test') 

будьте осторожны, так как он удаляет файлы и подкаталоги.

  • 2
    import shutil; shutil.rmtree('/home/me/test')
  • 21
    Обратите внимание, что использование shutil.rmtree () также удалит папку в конце указанного пути (это не удаляет содержимое каталога, оно удаляет каталог)
Показать ещё 1 комментарий
10

os.remove не разрешает шаблоны в стиле unix. Если вы используете Unix-подобную систему, вы можете:

os.system('rm '+test)

Иначе вы можете:

import glob, os
test = '/path/*'
r = glob.glob(test)
for i in r:
   os.remove(i)
  • 0
    os.system имеет много предостережений, в том числе не разрешает шаблоны глобов (так как он просто передает строку в оболочку); glob возвращает каталоги, а также файлы (которые os.remove не обрабатывает)
  • 0
    лучший ответ на данный момент:
7

Поскольку * - это оболочечная конструкция. Python буквально ищет файл с именем "*" в каталоге /home/me/test. Используйте listdir, чтобы сначала получить список файлов, а затем вызывать удаление на каждом из них.

5

Еще один способ, которым я это сделал:

os.popen('rm -f ./yourdir')
  • 2
    не переносимый и rm -f directory просто не работает. Интересно, почему за это так много проголосовало.
1

Хотя это старый вопрос, я думаю, что никто не ответил на этот подход:

#python 2.7
import os

filesToRemove = [f for f in os.listdir('/home/me/test')]
os.remove(f) for f in files
  • 3
    Вам нужно os.remove() полный путь к файлу, когда вы используете os.remove() , поэтому вам нужно будет выполнить os.remove(os.path.join("/home/me/test", f)) для этого работать.
  • 0
    плюс строка os.remove(f) for f in files не является допустимым синтаксисом. Не все использует понимание.
Показать ещё 4 комментария
1

звезда расширяется оболочкой Unix. Ваш вызов не имеет доступа к оболочке, он просто пытается удалить файл с именем, заканчивающимся звездочкой

0
#python 2.7
import tempfile
import shutil
import exceptions
import os

def TempCleaner():
    temp_dir_name = tempfile.gettempdir()
    for currentdir in os.listdir(temp_dir_name):
        try:
           shutil.rmtree(os.path.join(temp_dir_name, currentdir))
        except exceptions.WindowsError, e:
            print u'Не удалось удалить:'+ e.filename
0

Пожалуйста, см. мой ответ здесь:

https://stackoverflow.com/questions/185936/how-to-delete-the-contents-of-a-folder-in-python

Это долгое и безобразное, но надежное и эффективное решение.

Он решает несколько проблем, которые не рассматриваются другими респондентами:

  • Он правильно обрабатывает символические ссылки, в том числе не вызывая shutil.rmtree() по символической ссылке (которая пройдет тест os.path.isdir(), если она ссылается на каталог).
  • Он отлично обрабатывает файлы только для чтения.
  • 0
    в этом случае лучший способ - пометить как дубликат.
0

shutil.rmtree() для большинства случаев. Но это не работает в Windows для файлов readonly. Для Windows импортируйте win32api и win32con модули из PyWin32.

def rmtree(dirname):
    retry = True
    while retry:
        retry = False
        try:
            shutil.rmtree(dirname)
        except exceptions.WindowsError, e:
            if e.winerror == 5: # No write permission
                win32api.SetFileAttributes(dirname, win32con.FILE_ATTRIBUTE_NORMAL)
                retry = True
0

os.remove удалит только один файл.

Чтобы удалить с помощью подстановочных знаков, вам нужно написать свою собственную процедуру, которая обрабатывает это.

Есть несколько предложенных подходов, перечисленных на этой странице форума.

Ещё вопросы

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