Удаление каталога в Python

shutil.rmtree не будет удалять файлы только для чтения в Windows. Есть ли эквивалент python "rm -rf"? Почему, почему это такая боль?

Ответ 1

shutil.rmtree может принимать функцию обработки ошибок, которая будет вызываться, когда возникает проблема с удалением файла. Вы можете использовать это для принудительного удаления проблемных файлов.

Вдохновленный http://mail.python.org/pipermail/tutor/2006-June/047551.html и http://techarttiki.blogspot.com/2008/08/read-only-windows-files-with-python.html

import os
import stat
import shutil

def remove_readonly(func, path, excinfo):
    os.chmod(path, stat.S_IWRITE)
    func(path)

shutil.rmtree(top, onerror=remove_readonly)

(я не тестировал этот фрагмент, но этого должно быть достаточно, чтобы вы начали)

Ответ 2

Если вы импортируете win32api из PyWin32, вы можете использовать:

win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_NORMAL)

Чтобы файлы перестали быть доступными только для чтения.

Ответ 3

Другой способ - определить rmtree для Windows как

rmtree = lambda path: subprocess.check_call(['cmd', '/c', 'rd', '/s', '/q', path])

Ответ 4

На сайте ActiveState есть комментарий:

У shutil.rmtree есть свои недостатки. Хотя верно, что во многих случаях вы можете использовать shutil.rmtree(), есть случаи, когда он не работает. Например, файлы, помеченные только для чтения под Windows, не могут быть удалены с помощью shutil.rmtree().

Импортируя модули win32api и win32con из PyWin32 и добавляя к функции rmgeneric() функцию win32api.SetFileAttributes(путь, win32con.FILE_ATTRIBUTE_NORMAL), это препятствие можно преодолеть. Я использовал этот подход для исправления горячей резервной копии .py script Subversion 1.4, поэтому он будет работать под Windows. Спасибо за рецепт.

Я не использую Windows, поэтому не могу проверить, работает это или нет.

Ответ 6

Предположительно, это будет исправлено с выпуском Python 3.5 (в настоящее время - июнь 2015 года - все еще находится в разработке) в смысле указания в документации.

Здесь вы можете найти bugreport здесь. И this является соответствующим набором изменений.

См. недавно добавленный пример из Документов Python 3.5:

import os, stat
import shutil

def remove_readonly(func, path, _):
    "Clear the readonly bit and reattempt the removal"
    os.chmod(path, stat.S_IWRITE)
    func(path)

shutil.rmtree(directory, onerror=remove_readonly)