Я получаю сообщение об ошибке «Отказано в доступе» при попытке удалить не пустую папку. Я использовал следующую команду в мою попытку: os.remove("/folder_name")
.
Каков наиболее эффективный способ удаления / удаления папки / каталога, который не является пустым?
rm -rf
поведении смотрите: stackoverflow.com/questions/814167/…Ответы:
Ссылка на стандартную библиотеку: shutil.rmtree .
По замыслу, происходит
rmtree
сбой в деревьях папок, содержащих файлы только для чтения. Если вы хотите, чтобы папка была удалена независимо от того, содержит ли она файлы только для чтения, используйтеисточник
rmtree
произойдет сбой, если есть файлы только для чтения: stackoverflow.com/questions/2656322/…Из документации по питону
os.walk()
:источник
источник
ignore_errors=True
решает проблему.onerror
вместо параметра используется параметрignore_errors
. Таким образом, файлы только для чтения удаляются, а не игнорируются.rmtree()
метод игнорируется.из python 3.4 вы можете использовать:
где
pth
этоpathlib.Path
экземпляр. Приятно, но, возможно, не самый быстрый.источник
С docs.python.org :
источник
Если установлено ignore_errors, ошибки игнорируются; в противном случае, если установлено значение onerror, оно вызывается для обработки ошибки с аргументами (func, path, exc_info), где func - это os.listdir, os.remove или os.rmdir; путь - это аргумент этой функции, который вызвал ее сбой; и exc_info - это кортеж, возвращаемый sys.exc_info (). Если ignore_errors - false, а onerror - None, возникает исключение. Введите здесь код
источник
Основываясь на ответе kkubasik, проверьте, существует ли папка перед удалением, более надежный
источник
try
удалить и обработать,except
чем вызватьexists()
первымесли вы уверены, что хотите удалить все дерево dir и больше не интересуетесь содержимым dir, то сканирование всего дерева dir - это глупость ... просто вызовите для этого команду родной ОС из python. Это будет быстрее, эффективнее и потребляет меньше памяти.
или * nix
В Python код будет выглядеть так ...
источник
shutil.rmdir
заключается в том, чтобы изолировать вас от типа операционной системы.Просто несколько вариантов Python 3.5, чтобы завершить ответы выше. (Мне бы очень хотелось найти их здесь).
Удалить папку, если она пуста
Удалить также папку, если она содержит этот файл
удалить папку, если она содержит только файлы .srt или .txt
Удалить папку, если ее размер меньше 400 КБ:
источник
if files[0]== "desktop.ini" or:
Я хотел бы добавить «чистый путь»:
Это основано на том факте, что
Path
это можно заказать, и более длинные пути всегда будут сортироваться после более коротких путей, какstr
. Поэтому каталоги будут предшествовать файлам. Если мы перевернем сортировку, то файлы будут находиться перед соответствующими контейнерами, поэтому мы можем просто отсоединить / rmdir их один за другим с одним проходом.Льготы:
pathlib
обещано в Python 3.6; ни одна из указанных выше операций не работает в Windows)источник
источник
Если вы не хотите использовать
shutil
модуль, вы можете просто использоватьos
модуль.источник
os.remove
не может удалить каталоги, поэтому он будет повышен,OsError
еслиdirectoryToRemove
содержит подкаталоги.Десять лет спустя и с использованием Python 3.7 и Linux все еще существуют разные способы сделать это:
По сути, он использует модуль подпроцесса Python для запуска скрипта bash,
$ rm -rf '/path/to/your/dir
как если бы вы использовали терминал для выполнения той же задачи. Это не полностью Python, но это делается.Причина, по которой я включил этот
pathlib.Path
пример, заключается в том, что, по моему опыту, он очень полезен при работе со многими путями, которые меняются. Дополнительные этапы импортаpathlib.Path
модуля и преобразования конечных результатов в строки часто обходятся мне дешевле из-за времени разработки. Было бы удобно, если быPath.rmdir()
присутствовал параметр arg для явной обработки непустых директорий.источник
rmtree
и скрытых папок, как.vscode
. Эта папка была обнаружена как текстовый файл, и ошибка сказала мне, что этот файл былbusy
и не может быть удален.Удалить папку, даже если она может не существовать (избегая условия гонки в ответе Чарльза Чоу ), но при этом все равно возникают ошибки, когда что-то идет не так (например, проблемы с правами доступа, ошибка чтения с диска, файл не является каталогом)
Для Python 3.x:
Код Python 2.7 почти такой же:
источник
С os.walk я бы предложил решение, которое состоит из 3 однострочных вызовов Python:
Первый скрипт chmod - все подкаталоги, второй скрипт chmod - все файлы. Затем третий сценарий удаляет все без препятствий.
Я проверил это из «Shell Script» на задании Jenkins (я не хотел сохранять новый скрипт Python в SCM, поэтому искал однострочное решение), и он работал для Linux и Windows.
источник
pathlib
, вы можете объединить первые два шага в один:[p.chmod(0o666) for p in pathlib.Path(_path_).glob("**/*")]
Вы можете использовать команду os.system для простоты:
Как очевидно, он фактически вызывает системный терминал для выполнения этой задачи.
источник
Я нашел очень простой способ удалить любую папку (даже НЕ пустую) или файл в ОС WINDOWS .
источник
Для Windows, если каталог не пустой, и у вас есть файлы только для чтения, или вы получаете ошибки, такие как
Access is denied
The process cannot access the file because it is being used by another process
Попробуй это,
os.system('rmdir /S /Q "{}"'.format(directory))
Это эквивалентно для
rm -rf
Linux / Mac.источник