Estou recebendo um erro 'acesso negado' quando tento excluir uma pasta que não está vazia. Eu usei o seguinte comando na minha tentativa: os.remove("/folder_name")
.
Qual é a maneira mais eficaz de remover / excluir uma pasta / diretório que não está vazio?
rm -rf
comportamento específico , consulte: stackoverflow.com/questions/814167/…Respostas:
Referência da biblioteca padrão: shutil.rmtree .
Por design,
rmtree
falha nas árvores de pastas que contêm arquivos somente leitura. Se você deseja que a pasta seja excluída, independentemente de conter arquivos somente leitura, usefonte
rmtree
falhará se houver arquivos somente leitura: stackoverflow.com/questions/2656322/…A partir dos documentos python em
os.walk()
:fonte
fonte
ignore_errors=True
resolve o problema.onerror
parâmetro é usado em vez deignore_errors
. Dessa maneira, os arquivos somente leitura são excluídos em vez de ignorados.rmtree()
método é ignorado.do python 3.4 você pode usar:
onde
pth
é umapathlib.Path
instância Bom, mas pode não ser o mais rápido.fonte
Do docs.python.org :
fonte
Se ignore_errors estiver definido, os erros serão ignorados; caso contrário, se onerror for definido, ele será chamado para manipular o erro com argumentos (func, path, exc_info) em que func é os.listdir, os.remove ou os.rmdir; path é o argumento para essa função que causou a falha; e exc_info é uma tupla retornada por sys.exc_info (). Se ignore_errors for false e onerror for None, uma exceção será gerada.
fonte
Com base na resposta do kkubasik, verifique se a pasta existe antes de remover, mais robusta
fonte
try
remover e alçaexcept
de chamadaexists()
primeirose você tiver certeza de que deseja excluir toda a árvore de diretórios e não estiver mais interessado no conteúdo dele, rastrear toda a árvore de diretórios é estúpido ... basta chamar o comando nativo do SO do python para fazer isso. Será mais rápido, eficiente e consumirá menos memória.
ou * nix
Em python, o código terá a aparência ..
fonte
shutil.rmdir
é isolá-lo do tipo de sistema operacional.Apenas algumas opções do python 3.5 para concluir as respostas acima. (Eu adoraria encontrá-los aqui).
Excluir pasta se estiver vazio
Exclua também a pasta se ela contiver este arquivo
exclua a pasta se ela contiver apenas arquivos .srt ou .txt
Exclua a pasta se o tamanho for menor que 400kb:
fonte
if files[0]== "desktop.ini" or:
Eu gostaria de adicionar uma abordagem de "pathlib puro":
Isso depende do fato de
Path
ser ordenável, e caminhos mais longos sempre serão classificados após caminhos mais curtos, assim comostr
. Portanto, os diretórios virão antes dos arquivos. Se invertermos a classificação, os arquivos virão antes de seus respectivos contêineres, para que possamos simplesmente desvincular / rmdir deles um a um com uma passagem.Benefícios:
pathlib
promete no Python 3.6; nenhuma operação acima mencionada não deve ser executada no Windows)fonte
fonte
Se você não quiser usar o
shutil
módulo, basta usá-loos
.fonte
os.remove
não pode remover diretórios, portanto, isso aumentaráOsError
sedirectoryToRemove
contiver subdiretórios.Dez anos depois, e usando Python 3.7 e Linux, ainda existem maneiras diferentes de fazer isso:
Essencialmente, ele está usando o módulo de subprocesso do Python para executar o script bash
$ rm -rf '/path/to/your/dir
como se você estivesse usando o terminal para realizar a mesma tarefa. Não é totalmente Python, mas é feito.A razão pela qual incluí o
pathlib.Path
exemplo é porque, em minha experiência, é muito útil ao lidar com muitos caminhos que mudam. As etapas extras de importação dopathlib.Path
módulo e conversão dos resultados finais em seqüências de caracteres costumam ser um custo menor para o tempo de desenvolvimento. Seria conveniente sePath.rmdir()
viesse com uma opção arg para lidar explicitamente com diretórios não vazios.fonte
rmtree
pastas ocultas como.vscode
. Esta pasta foi detectada como arquivo de texto e o erro me informou que esse arquivo foibusy
e não pôde ser excluído.Para excluir uma pasta mesmo que ela não exista (evitando a condição de corrida na resposta de Charles Chow ), mas ainda tenha erros quando outras coisas derem errado (por exemplo, problemas de permissão, erro de leitura de disco, o arquivo não é um diretório)
Para Python 3.x:
O código Python 2.7 é quase o mesmo:
fonte
Com o os.walk, eu proporia a solução que consiste em 3 chamadas Python de uma linha:
O primeiro script chmod é todos os subdiretórios, o segundo script chmod é todos os arquivos. Em seguida, o terceiro script remove tudo sem impedimentos.
Eu testei isso no "Shell Script" em um trabalho de Jenkins (não queria armazenar um novo script Python no SCM, por isso procurei uma solução de uma linha) e funcionou para Linux e Windows.
fonte
pathlib
, você pode combinar as duas primeiras etapas em uma:[p.chmod(0o666) for p in pathlib.Path(_path_).glob("**/*")]
Você pode usar o comando os.system para simplificar:
Como óbvio, ele realmente chama o terminal do sistema para realizar esta tarefa.
fonte
Eu encontrei uma maneira muito fácil de excluir qualquer pasta (mesmo que não esteja vazia) ou arquivo no sistema operacional WINDOWS .
fonte
Para Windows, se o diretório não estiver vazio e você tiver arquivos somente leitura ou tiver erros como
Access is denied
The process cannot access the file because it is being used by another process
Tente isso,
os.system('rmdir /S /Q "{}"'.format(directory))
É equivalente
rm -rf
no Linux / Mac.fonte