Excluindo todos os arquivos em um diretório com Python

147

Quero excluir todos os arquivos com a extensão .bakem um diretório. Como posso fazer isso em Python?

slh2080
fonte
5
@ slh2080: Postar "Resolvido" não é o que você faz neste site. O que você faz é escolher a resposta que realmente usou e clicar na marca de seleção para indicar que resolveu o seu problema.
S.Lott
1
Desculpe. Obrigado por apontar meu erro. Não é tarefa de casa, apenas aprender python no meu tempo livre. Cliquei na resposta que usei, mas isso foi antes de eu ver a resposta ghostdog74.
slh2080
nota: para excluir uma árvore de diretório inteira shutil.rmtree(path)poderia ser usada .
JFS
Possível duplicata de Como excluir o conteúdo de uma pasta no Python?
FabioSpaghetti

Respostas:

270

Via os.listdire os.remove:

import os

filelist = [ f for f in os.listdir(mydir) if f.endswith(".bak") ]
for f in filelist:
    os.remove(os.path.join(mydir, f))

Ou via glob.glob:

import glob, os, os.path

filelist = glob.glob(os.path.join(mydir, "*.bak"))
for f in filelist:
    os.remove(f)

Certifique-se de estar no diretório correto, eventualmente usando os.chdir.

miku
fonte
21
Seu primeiro exemplo é usar redundantes para loops. Você pode passar com - [os.remove (f) para f em os.listdir (".") Se f.endswith (". Bak")] - como as compreensões de lista devem ser usadas. Ou você pode mover o 'if' na compreensão para o loop for - for f em os.listdir ("."): If f.endswith (". Bak"): os.remove (f)
dragonjujo
@ slh2080 Como você diz que o problema foi resolvido, por que não marcar a resposta como correta?
blwy10
5
Cuidado com o os.listdir (".") !!! Eu usei esse código e esqueci de mudar o caminho, todo o meu código se foi !!! Tentei dois utilitários diferentes para recuperar, mas sem sorte !!
Lei Guo
@LeiGuo Corrigido isso.
yugr 8/10/19
26

Use os.chdirpara alterar o diretório. Use glob.globpara gerar uma lista de nomes de arquivos que terminam com '.bak'. Os elementos da lista são apenas strings.

Então você pode usar os.unlinkpara remover os arquivos. (PS. os.unlinkE os.removesão sinônimos para a mesma função.)

#!/usr/bin/env python
import glob
import os
directory='/path/to/dir'
os.chdir(directory)
files=glob.glob('*.bak')
for filename in files:
    os.unlink(filename)
unutbu
fonte
18

No Python 3.5, os.scandiré melhor se você precisar verificar os atributos ou o tipo de arquivo - consulte as os.DirEntrypropriedades do objeto retornado pela função.

import os 

for file in os.scandir(path):
    if file.name.endswith(".bak"):
        os.unlink(file.path)

Isso também não requer alteração de diretórios, pois cada um DirEntryjá inclui o caminho completo para o arquivo.

Yi Jiang
fonte
Você está perdendo dois pontos, a primeira linha dentro do loop for deve serif file.name.endswith(".bak"):
TSeymour
Obrigado! Isso vai me ensinar a escrever código sem realmente executá-los
Yi Jiang
8

você pode criar uma função. Adicione maxdepth como desejar para percorrer subdiretórios.

def findNremove(path,pattern,maxdepth=1):
    cpath=path.count(os.sep)
    for r,d,f in os.walk(path):
        if r.count(os.sep) - cpath <maxdepth:
            for files in f:
                if files.endswith(pattern):
                    try:
                        print "Removing %s" % (os.path.join(r,files))
                        #os.remove(os.path.join(r,files))
                    except Exception,e:
                        print e
                    else:
                        print "%s removed" % (os.path.join(r,files))

path=os.path.join("/home","dir1","dir2")
findNremove(path,".bak")
ghostdog74
fonte
1

No Linux e macOS, você pode executar um comando simples no shell:

subprocess.run('rm /tmp/*.bak', shell=True)
Vitaly Zdanevich
fonte
3
Não é uma boa escolha na minha opinião. Não é portátil e provavelmente é mais caro devido ao subprocesso extra. Melhor usar APIs Python.
Haakon
0

Eu sei que isso é velho; no entanto, aqui seria como fazê-lo usando apenas o módulo OS ...

def purgedir(parent):
    for root, dirs, files in os.walk(parent):                                      
        for item in files:
            # Delete subordinate files                                                 
            filespec = os.path.join(root, item)
            if filespec.endswith('.bak'):
                os.unlink(filespec)
        for item in dirs:
            # Recursively perform this operation for subordinate directories   
            purgedir(os.path.join(root, item))
M.Markfort
fonte