Como excluir um arquivo ou pasta?

Respostas:

3346

PathOs objetos do pathlibmódulo Python 3.4+ também expõem estes métodos de instância:

RichieHindle
fonte
5
os.rmdir () no Windows também remove diretório link simbólico, mesmo se o dir-alvo não está vazio
Lu55
8
Se o arquivo não existir, os.remove()lança uma exceção; portanto, pode ser necessário verificar os.path.isfile()primeiro ou agrupar um try.
Ben Crowell
2
Desejo Path.unlink 1 / foi recursivo 2 / adicionar uma opção para ignorar FileNotfoundError.
Jérôme
7
apenas para conclusão ... a exceção gerada os.remove()se um arquivo não existir é FileNotFoundError.
PedroA
São os.remove() necessários vários argumentos para excluir vários arquivos ou você o chama sempre para cada arquivo?
user742864
292

Sintaxe Python para excluir um arquivo

import os
os.remove("/tmp/<file_name>.txt")

Ou

import os
os.unlink("/tmp/<file_name>.txt")

Ou

Biblioteca pathlib para versão Python> 3.5

file_to_rem = pathlib.Path("/tmp/<file_name>.txt")
file_to_rem.unlink()

Path.unlink (missing_ok = False)

Desvincule o método usado para remover o arquivo ou o link symbolik.

Se missing_ok for false (o padrão), FileNotFoundError será gerado se o caminho não existir.
Se missing_ok for true, as exceções FileNotFoundError serão ignoradas (mesmo comportamento que o comando POSIX rm -f).
Alterado na versão 3.8: O parâmetro missing_ok foi adicionado.

Melhor prática

  1. Primeiro, verifique se o arquivo ou pasta existe ou não e exclua apenas esse arquivo. Isso pode ser alcançado de duas maneiras:
    a. os.path.isfile("/path/to/file")
    b. Usarexception handling.

EXEMPLO paraos.path.isfile

#!/usr/bin/python
import os
myfile="/tmp/foo.txt"

## If file exists, delete it ##
if os.path.isfile(myfile):
    os.remove(myfile)
else:    ## Show an error ##
    print("Error: %s file not found" % myfile)

Manipulação de exceção

#!/usr/bin/python
import os

## Get input ##
myfile= raw_input("Enter file name to delete: ")

## Try to delete the file ##
try:
    os.remove(myfile)
except OSError as e:  ## if failed, report it back to the user ##
    print ("Error: %s - %s." % (e.filename, e.strerror))

RESPEITO RESPEITO

Digite o nome do arquivo para excluir: demo.txt
Erro: demo.txt - Esse arquivo ou diretório não existe.

Digite o nome do arquivo a ser excluído: rrr.txt
Erro: rrr.txt - operação não permitida.

Digite o nome do arquivo para excluir: foo.txt

Sintaxe Python para excluir uma pasta

shutil.rmtree()

Exemplo para shutil.rmtree()

#!/usr/bin/python
import os
import sys
import shutil

# Get directory name
mydir= raw_input("Enter directory name: ")

## Try to remove tree; if failed show an error using try...except on screen
try:
    shutil.rmtree(mydir)
except OSError as e:
    print ("Error: %s - %s." % (e.filename, e.strerror))
anand tripathi
fonte
13
O tratamento de exceção é recomendado durante a verificação, porque o arquivo pode ser removido ou alterado entre as duas linhas (TOCTOU: en.wikipedia.org/wiki/Time_of_check_to_time_of_use ) Consulte as Perguntas frequentes sobre Python docs.python.org/3/glossary.html#term-eafp
Éric Araujo
84

Usar

shutil.rmtree(path[, ignore_errors[, onerror]])

(Veja a documentação completa em shutil ) e / ou

os.remove

e

os.rmdir

(Documentação completa em os .)

Mihai Maruseac
fonte
6
Por favor, adicione a interface pathlib (nova desde o Python 3.4) à sua lista.
Paebbels
38

Aqui está uma função robusta que usa ambos os.removee shutil.rmtree:

def remove(path):
    """ param <path> could either be relative or absolute. """
    if os.path.isfile(path) or os.path.islink(path):
        os.remove(path)  # remove the file
    elif os.path.isdir(path):
        shutil.rmtree(path)  # remove dir and all contains
    else:
        raise ValueError("file {} is not a file or dir.".format(path))
flycee
fonte
8
Ou seja, 8 linhas de código para simular a remove(path);chamada ISO C.
Kaz
2
@Kaz concordou irritante, mas remove lidar com árvores? :-)
Ciro Santilli escreveu
6
os.path.islink(file_path): um bug, deve seros.path.islink(path):
Neo li
32

Você pode usar o built-in pathlibmódulo (requer Python 3.4+, mas há backports para versões mais antigas sobre PyPI: pathlib, pathlib2).

Para remover um arquivo, existe o unlinkmétodo:

import pathlib
path = pathlib.Path(name_of_file)
path.unlink()

Ou o rmdirmétodo para remover uma pasta vazia :

import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()
MSeifert
fonte
2
Mas e quanto a um diretório não vazio?
Pranasas
@Pranasas Infelizmente, parece que não há nada (nativamente) pathlibque possa lidar com a exclusão de diretórios não vazios. No entanto, você pode usar shutil.rmtree. Foi mencionado em várias das outras respostas, por isso não o incluí.
MSDIFER #
30

Como faço para excluir um arquivo ou pasta no Python?

No Python 3, para remover o arquivo e o diretório individualmente, use os métodos unlinke object, respectivamente:rmdir Path

from pathlib import Path
dir_path = Path.home() / 'directory' 
file_path = dir_path / 'file'

file_path.unlink() # remove file

dir_path.rmdir()   # remove directory

Observe que você também pode usar caminhos relativos com Pathobjetos e verificar seu diretório de trabalho atual com Path.cwd.

Para remover arquivos e diretórios individuais no Python 2, consulte a seção rotulada abaixo.

Para remover um diretório com conteúdo, use shutil.rmtreee observe que ele está disponível no Python 2 e 3:

from shutil import rmtree

rmtree(dir_path)

Demonstração

O novo no Python 3.4 é o Pathobjeto.

Vamos usar um para criar um diretório e um arquivo para demonstrar o uso. Observe que usamos o /para juntar as partes do caminho, isso soluciona problemas entre sistemas operacionais e problemas ao usar barras invertidas no Windows (onde você precisaria dobrar suas barras invertidas \\ou usar strings brutas, como r"foo\bar"):

from pathlib import Path

# .home() is new in 3.5, otherwise use os.path.expanduser('~')
directory_path = Path.home() / 'directory'
directory_path.mkdir()

file_path = directory_path / 'file'
file_path.touch()

e agora:

>>> file_path.is_file()
True

Agora vamos excluí-los. Primeiro o arquivo:

>>> file_path.unlink()     # remove file
>>> file_path.is_file()
False
>>> file_path.exists()
False

Podemos usar globbing para remover vários arquivos - primeiro vamos criar alguns arquivos para isso:

>>> (directory_path / 'foo.my').touch()
>>> (directory_path / 'bar.my').touch()

Em seguida, itere sobre o padrão glob:

>>> for each_file_path in directory_path.glob('*.my'):
...     print(f'removing {each_file_path}')
...     each_file_path.unlink()
... 
removing ~/directory/foo.my
removing ~/directory/bar.my

Agora, demonstrando a remoção do diretório:

>>> directory_path.rmdir() # remove directory
>>> directory_path.is_dir()
False
>>> directory_path.exists()
False

E se quisermos remover um diretório e tudo nele? Para este caso de uso, useshutil.rmtree

Vamos recriar nosso diretório e arquivo:

file_path.parent.mkdir()
file_path.touch()

e observe que rmdirfalha, a menos que esteja vazio, e é por isso que rmtree é tão conveniente:

>>> directory_path.rmdir()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "~/anaconda3/lib/python3.6/pathlib.py", line 1270, in rmdir
    self._accessor.rmdir(self)
  File "~/anaconda3/lib/python3.6/pathlib.py", line 387, in wrapped
    return strfunc(str(pathobj), *args)
OSError: [Errno 39] Directory not empty: '/home/username/directory'

Agora, importe rmtree e passe o diretório para a função:

from shutil import rmtree
rmtree(directory_path)      # remove everything 

e podemos ver que tudo foi removido:

>>> directory_path.exists()
False

Python 2

Se você estiver no Python 2, há um backport do módulo pathlib chamado pathlib2 , que pode ser instalado com o pip:

$ pip install pathlib2

E então você pode usar o alias da biblioteca para pathlib

import pathlib2 as pathlib

Ou apenas importe diretamente o Pathobjeto (como demonstrado aqui):

from pathlib2 import Path

Se for demais, você pode remover arquivos com os.removeouos.unlink

from os import unlink, remove
from os.path import join, expanduser

remove(join(expanduser('~'), 'directory/file'))

ou

unlink(join(expanduser('~'), 'directory/file'))

e você pode remover diretórios com os.rmdir:

from os import rmdir

rmdir(join(expanduser('~'), 'directory'))

Observe que também existe um os.removedirs- ele remove apenas diretórios vazios recursivamente, mas pode ser adequado ao seu caso de uso.

Aaron Hall
fonte
rmtree(directory_path)funciona no python 3.6.6, mas não no python 3.5.2 - você precisa de rmtree(str(directory_path)))lá.
Stein
4
import os

folder = '/Path/to/yourDir/'
fileList = os.listdir(folder)

for f in fileList:
    filePath = folder + '/'+f

    if os.path.isfile(filePath):
        os.remove(filePath)

    elif os.path.isdir(filePath):
        newFileList = os.listdir(filePath)
        for f1 in newFileList:
            insideFilePath = filePath + '/' + f1

            if os.path.isfile(insideFilePath):
                os.remove(insideFilePath)
Lalithesh
fonte
1
Isto irá apagar apenas os arquivos dentro da pasta e subpastas deixando a estrutura de pastas intacta ..
Lalithesh
4

shutil.rmtree é a função assíncrona; portanto, se você quiser verificar quando está completo, poderá usar while ... loop

import os
import shutil

shutil.rmtree(path)

while os.path.exists(path):
  pass

print('done')
m0z4rt
fonte
1
shutil.rmtreenão deve ser assíncrono. No entanto, pode parecer estar no Windows com antivírus interferindo.
mhsmith
scanners de vírus @mhsmith ? Isso é especulação selvagem, ou você realmente sabe que eles podem causar esse efeito? Como diabos isso funciona?
Mark Amery
2

Para excluir arquivos:

os.unlink(path, *, dir_fd=None)

ou

os.remove(path, *, dir_fd=None)

Ambas as funções são semanticamente iguais. Esta função remove (exclui) o caminho do arquivo. Se o caminho não for um arquivo e for um diretório, a exceção será gerada.

Para excluir pastas:

shutil.rmtree(path, ignore_errors=False, onerror=None)

ou

os.rmdir(path, *, dir_fd=None)

Para remover árvores de diretório inteiras, shutil.rmtree()pode ser usado. os.rmdirsó funciona quando o diretório está vazio e existe.

Para excluir pastas recursivamente em relação aos pais:

os.removedirs(name)

Ele remove todos os diretórios-pai vazios por conta própria até o pai, que possui algum conteúdo

ex. os.removedirs ('abc / xyz / pqr') removerá os diretórios ordenando 'abc / xyz / pqr', 'abc / xyz' e 'abc' se estiverem vazios.

Para mais informações cheque doc oficial: os.unlink, os.remove, os.rmdir, shutil.rmtree,os.removedirs

Somnath Muluk
fonte
1

Para remover todos os arquivos na pasta

import os
import glob

files = glob.glob(os.path.join('path/to/folder/*'))
files = glob.glob(os.path.join('path/to/folder/*.csv')) // It will give all csv files in folder
for file in files:
    os.remove(file)

Para remover todas as pastas em um diretório

from shutil import rmtree
import os

// os.path.join()  # current working directory.

for dirct in os.listdir(os.path.join('path/to/folder')):
    rmtree(os.path.join('path/to/folder',dirct))
Sarender Reddy
fonte
0

Para evitar o problema TOCTOU destacado pelo comentário de Éric Araujo , você pode capturar uma exceção para chamar o método correto:

def remove_file_or_dir(path: str) -> None:
    """ Remove a file or directory """
    try:
        shutil.rmtree(path)
    except NotADirectoryError:
        os.remove(path)

Desde shutil.rmtree()removerá somente diretórios e os.remove()ou os.unlink()somente removerá arquivos.

Isaac Turner
fonte
shutil.rmtree()remove não apenas o diretório, mas também seu conteúdo.
Tiago Martins Peres 李大仁 30/04
-1

Eu recomendo usar subprocessse escrever um código bonito e legível é sua xícara de chá:

import subprocess
subprocess.Popen("rm -r my_dir", shell=True)

E se você não é um engenheiro de software, talvez considere usar o Jupyter; você pode simplesmente digitar comandos bash:

!rm -r my_dir

Tradicionalmente, você usa shutil:

import shutil
shutil.rmtree(my_dir) 
Miladiouss
fonte
3
Subprocesso é prática a ser evitada
dlewin
3
Eu não recomendaria subprocesspara isso. shutil.rmtreefaz rm -ro trabalho muito bem, com o bônus adicional de trabalhar no Windows.
Mark Amery