Como excluir um arquivo ou pasta no Python?
Como excluir um arquivo ou pasta no Python?
Respostas:
os.remove()
remove um arquivo.
os.rmdir()
remove um diretório vazio.
shutil.rmtree()
exclui um diretório e todo o seu conteúdo.
Path
Os objetos do pathlib
módulo Python 3.4+ também expõem estes métodos de instância:
pathlib.Path.unlink()
remove um arquivo ou link simbólico.
pathlib.Path.rmdir()
remove um diretório vazio.
os.remove()
lança uma exceção; portanto, pode ser necessário verificar os.path.isfile()
primeiro ou agrupar um try
.
os.remove()
se um arquivo não existir é FileNotFoundError
.
os.remove()
necessários vários argumentos para excluir vários arquivos ou você o chama sempre para cada 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()
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.
os.path.isfile("/path/to/file")
exception 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)
#!/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))
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
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))
Aqui está uma função robusta que usa ambos os.remove
e 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))
remove(path);
chamada ISO C.
os.path.islink(file_path):
um bug, deve seros.path.islink(path):
Você pode usar o built-in pathlib
módulo (requer Python 3.4+, mas há backports para versões mais antigas sobre PyPI: pathlib
, pathlib2
).
Para remover um arquivo, existe o unlink
método:
import pathlib
path = pathlib.Path(name_of_file)
path.unlink()
Ou o rmdir
método para remover uma pasta vazia :
import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()
pathlib
que 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í.
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 unlink
e 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 Path
objetos 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.rmtree
e observe que ele está disponível no Python 2 e 3:
from shutil import rmtree
rmtree(dir_path)
O novo no Python 3.4 é o Path
objeto.
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 rmdir
falha, 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
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 Path
objeto (como demonstrado aqui):
from pathlib2 import Path
Se for demais, você pode remover arquivos com os.remove
ouos.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.
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á.
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)
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')
shutil.rmtree
não deve ser assíncrono. No entanto, pode parecer estar no Windows com antivírus interferindo.
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.
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.rmdir
só funciona quando o diretório está vazio e existe.
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
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))
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.
shutil.rmtree()
remove não apenas o diretório, mas também seu conteúdo.
Eu recomendo usar subprocess
se 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)
subprocess
para isso. shutil.rmtree
faz rm -r
o trabalho muito bem, com o bônus adicional de trabalhar no Windows.