18 ответов:
Обновлено только для удаления файлов и использования ОС.путь.метод join (), предложенный в комментариях. Если вы также хотите удалить подкаталоги, раскомментируйте инструкцию elif.
import os, shutil folder = '/path/to/folder' for the_file in os.listdir(folder): file_path = os.path.join(folder, the_file) try: if os.path.isfile(file_path): os.unlink(file_path) #elif os.path.isdir(file_path): shutil.rmtree(file_path) except Exception as e: print(e)
попробуйте модуль shutil
import shutil shutil.rmtree('/path/to/folder')описание:
shutil.rmtree(path, ignore_errors=False, onerror=None)Docstring: рекурсивно удалить a дерево каталогов.
если
ignore_errorsустановлен, ошибки есть игнорируется; в противном случае, еслиonerror- это набор, он вызывается для обработки ошибки с помощью аргументы(func, path, exc_info)гдеfuncиos.listdir,os.remove, илиos.rmdir; путь является аргументом для этого функция, которая вызвала его сбой; иexc_infoкортеж возвращаютсяsys.exc_info(). Еслиignore_errorsis ложь иonerror- этоNone, an исключение.
вы можете просто сделать это :
import os import glob files = glob.glob('/YOUR/PATH/*') for f in files: os.remove(f)вы можете, конечно, использовать другой фильтр в вашем пути, например : /YOU/PATH/*.txt для удаления всех текстовых файлов в каталоге.
расширение ответа mhawke это то, что я реализовал. Он удаляет все содержимое папки а не саму папку. Протестировано на Linux с файлами, папками и символическими ссылками, должно работать и на Windows.
import os import shutil for root, dirs, files in os.walk('/path/to/folder'): for f in files: os.unlink(os.path.join(root, f)) for d in dirs: shutil.rmtree(os.path.join(root, d))
используя
rmtreeи воссоздание папки может работать, но я столкнулся с ошибками при удалении и немедленном воссоздании папок на сетевых дисках.предложенное решение с помощью walk не работает, так как он использует
rmtreeдля удаления папок, а затем может попытаться использоватьos.unlinkна файлы, которые ранее были в этих папках. Это приводит к ошибке.опубликовано
globрешение также попытается удалить пустые папки, вызывающие ошибки.Я предлагаю вам использовать:
folder_path = '/path/to/folder' for file_object in os.listdir(folder_path): file_object_path = os.path.join(folder_path, file_object) if os.path.isfile(file_object_path): os.unlink(file_object_path) else: shutil.rmtree(file_object_path)
Как oneliner:
import os # Python 2.7 map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) ) # Python 3+ list( map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) ) )более надежным решением для учета файлов и каталогов также будет (2.7):
def rm(f): if os.path.isdir(f): return os.rmdir(f) if os.path.isfile(f): return os.unlink(f) raise TypeError, 'must be either file or directory' map( rm, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
Примечания: в случае, если кто-то вниз проголосовал мой ответ, у меня есть что-то, чтобы объяснить здесь.
- все любят короткие и простые ответы. Однако иногда реальность не так проста.
- вернемся к моему ответу. Я знаю
shutil.rmtree()может использоваться для удаления дерева каталогов. Я использовал его много раз в своих проектах. Но вы должны понимать, что сам каталог также будет удаленshutil.rmtree(). Хотя это может быть приемлемо для некоторые, это не правильный ответ для удаление содержимого папки (без побочных эффектов).- я покажу вам пример побочных эффектов. Предположим, что у вас есть каталог с customized владелец и режим бит, где есть много содержимого. Затем вы удаляете его с помощью
shutil.rmtree()и восстановить его сos.mkdir(). И вы получите пустой каталог с по умолчанию (наследуется) владелец и режим бит вместо этого. В то время как вы могли бы иметь привилегия для удаления содержимого и даже каталога, вы не можете быть в состоянии установить обратно исходный владелец и режим бит в каталоге (например, вы не суперпользователь).- наконец, будьте терпеливы и прочитать код. Он длинный и уродливый (на виду), но оказался надежным и эффективным (в использовании).
вот длинное и уродливое, но надежное и эффективное решение.
он решает несколько проблем, которые не решаются другие ответчики:
- он правильно обрабатывает символические ссылки, в том числе и не называя
shutil.rmtree()по символической ссылке (которая будет передаватьos.path.isdir()проверьте, если он ссылается на каталог; даже результатos.walk()содержит также символические связанные каталоги).- он обрабатывает файлы только для чтения красиво.
вот код (единственная полезная функция
clear_dir()):import os import stat import shutil # http://stackoverflow.com/questions/1889597/deleting-directory-in-python def _remove_readonly(fn, path_, excinfo): # Handle read-only files and directories if fn is os.rmdir: os.chmod(path_, stat.S_IWRITE) os.rmdir(path_) elif fn is os.remove: os.lchmod(path_, stat.S_IWRITE) os.remove(path_) def force_remove_file_or_symlink(path_): try: os.remove(path_) except OSError: os.lchmod(path_, stat.S_IWRITE) os.remove(path_) # Code from shutil.rmtree() def is_regular_dir(path_): try: mode = os.lstat(path_).st_mode except os.error: mode = 0 return stat.S_ISDIR(mode) def clear_dir(path_): if is_regular_dir(path_): # Given path is a directory, clear its content for name in os.listdir(path_): fullpath = os.path.join(path_, name) if is_regular_dir(fullpath): shutil.rmtree(fullpath, onerror=_remove_readonly) else: force_remove_file_or_symlink(fullpath) else: # Given path is a file or a symlink. # Raise an exception here to avoid accidentally clearing the content # of a symbolic linked directory. raise OSError("Cannot call clear_dir() on a symbolic link")
Это единственный ответ до сих пор, который:
- удаляет символические ссылки
- мертвые ссылки
- ссылки на каталоги
- ссылки на файлы
- удаляет подкаталоги
- не удаляет родительский каталог
код:
for filename in os.listdir(dirpath): filepath = os.path.join(dirpath, filename) try: shutil.rmtree(filepath) except OSError: os.remove(filepath)Как и многие другие ответы, это не пытаться настроить разрешения для удаления файлов/каталогов.
возможно, вам лучше использовать
os.walk()для этого.
os.listdir()не отличает файлы от каталогов, и вы быстро попадете в беду, пытаясь разорвать их. Есть хороший пример использованияos.walk()рекурсивно удалить каталог здесь, и намеки на то, как адаптировать его к вашим обстоятельствам.
import os import shutil # Gather directory contents contents = [os.path.join(target_dir, i) for i in os.listdir(target_dir)] # Iterate and remove each item in the appropriate manner [os.remove(i) if os.path.isfile(i) or os.path.islink(i) else shutil.rmtree(i) for i in contents]в более раннем комментарии также упоминается использование ОС.scandir в Python 3.5+. Например:
import os import shutil with os.scandir(target_dir) as entries: for entry in entries: if entry.is_file() or entry.is_symlink(): os.remove(entry.path) elif entry.is_dir(): shutil.rmtree(entry.path)
я использовал, чтобы решить эту проблему таким образом:
import shutil import os shutil.rmtree(dirpath) os.mkdir(dirpath)
Я konw это старый поток, но я нашел что-то интересное с официального сайта python. Просто для обмена другой идеей для удаления всего содержимого в каталоге. Потому что у меня есть некоторые проблемы авторизации при использовании shutil.rmtree () и я не хочу удалять каталог и воссоздавать его. Оригинал адреса http://docs.python.org/2/library/os.html#os.walk. надеюсь, что это может помочь кому-то.
def emptydir(top): if(top == '/' or top == "\"): return else: for root, dirs, files in os.walk(top, topdown=False): for name in files: os.remove(os.path.join(root, name)) for name in dirs: os.rmdir(os.path.join(root, name))
Я решил проблему ошибки с rmtree makedirs, добавив время.сон () между ними.
if os.path.isdir(folder_location): shutil.rmtree(folder_location) time.sleep(.5) os.makedirs(folder_location, 0o777)
Если вы используете систему *nix, почему бы не использовать системную команду?
import os path = 'folder/to/clean' os.system('rm -rf %s/*' % path)
ответ для ограниченной, конкретной ситуации: предполагая, что вы хотите удалить файлы при сохранении дерева вложенных папок, вы можете использовать рекурсивный алгоритм:
import os def recursively_remove_files(f): if os.path.isfile(f): os.unlink(f) elif os.path.isdir(f): map(recursively_remove_files, [os.path.join(f,fi) for fi in os.listdir(f)]) recursively_remove_files(my_directory)может, немного не по теме, но я думаю, что многие найдут его полезным
предполагая, что
temp_dirдля удаления, однострочная команда с помощьюosбудет:_ = [os.remove(os.path.join(save_dir,i)) for i in os.listdir(temp_dir)]Примечание: это только 1-лайнер для удаления файлов " не удаляет каталоги.
надеюсь, что это помогает. Спасибо.
Это должно сделать трюк просто с помощью модуля ОС, чтобы перечислить, а затем удалить!
import os DIR = os.list('Folder') for i in range(len(DIR)): os.remove('Folder'+chr(92)+i)работал на меня, любые проблемы дайте мне знать!
Comments