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?


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

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.


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)

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.


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")


1

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

subprocess.run('rm /tmp/*.bak', shell=True)

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))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.