Usuwanie wszystkich plików w katalogu za pomocą Pythona

147

Chcę usunąć wszystkie pliki z rozszerzeniem .bakw katalogu. Jak mogę to zrobić w Pythonie?

slh2080
źródło
5
@ slh2080: Publikowanie „Rozwiązany” nie jest tym, co robisz na tej stronie. Wystarczy wybrać odpowiedź, której faktycznie użyłeś, i kliknąć znacznik wyboru, aby wskazać, że rozwiązała ona Twój problem.
S.Lott,
1
Przepraszam. Dzięki za wskazanie mojego błędu. To nie jest praca domowa, tylko nauka Pythona w wolnym czasie. Kliknąłem na odpowiedź, której użyłem, ale to było zanim zobaczyłem odpowiedź ghostdog74.
slh2080
Uwaga: aby usunąć całe drzewo katalogów shutil.rmtree(path)można użyć .
jfs
Możliwy duplikat Jak usunąć zawartość folderu w Pythonie?
FabioSpaghetti

Odpowiedzi:

270

Przez os.listdiri 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))

Lub przez glob.glob:

import glob, os, os.path

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

Upewnij się, że znajdujesz się we właściwym katalogu, ostatecznie używając os.chdir.

miku
źródło
21
Twoim pierwszym przykładem jest użycie nadmiarowych pętli. Możesz jeden przebieg za pomocą - [os.remove (f) for f in os.listdir (".") If f.endswith (". Bak")] - ponieważ mają być używane wyrażenia listowe. Lub możesz przenieść 'if' w zrozumieniu do pętli for - for f w os.listdir ("."): If f.endswith (". Bak"): os.remove (f)
dragonjujo
@ slh2080 Skoro twierdzisz, że problem został rozwiązany, dlaczego nie oznaczyć odpowiedzi jako poprawnej?
blwy10
5
Uważaj na os.listdir (".") !!! Użyłem tego kodu i zapomniałem zmienić ścieżki, cały mój kod zniknął !!! Próbowałem dwóch różnych narzędzi do odzyskania, ale bez powodzenia !!
Lei Guo
@LeiGuo Naprawiono to.
yugr
26

Służy os.chdirdo zmiany katalogu. Służy glob.globdo generowania listy nazw plików kończących się na „.bak”. Elementy listy to po prostu ciągi znaków.

Następnie możesz użyć os.unlinkdo usunięcia plików. (PS. os.unlinkI os.removesą synonimami tej samej funkcji.)

#!/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
źródło
18

W Pythonie 3.5 os.scandirlepiej jest sprawdzić atrybuty lub typ pliku - zobacz os.DirEntrywłaściwości obiektu zwracanego przez funkcję.

import os 

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

Nie wymaga to również zmiany katalogów, ponieważ każdy DirEntryzawiera już pełną ścieżkę do pliku.

Yi Jiang
źródło
Brakuje dwukropka, pierwsza linia wewnątrz pętli for powinna brzmiećif file.name.endswith(".bak"):
TSeymour
Dzięki! To nauczy mnie pisać kod bez ich uruchamiania
Yi Jiang
8

możesz stworzyć funkcję. Dodaj maxdepth, jak chcesz, do przechodzenia przez podkatalogi.

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
źródło
1

W systemie Linux i macOS możesz uruchomić proste polecenie w powłoce:

subprocess.run('rm /tmp/*.bak', shell=True)
Witalij Zdanevich
źródło
3
Moim zdaniem niezbyt dobry wybór. Nie jest przenośny i prawdopodobnie jest droższy ze względu na dodatkowy podproces. Lepiej używać interfejsów API Pythona.
Haakon
0

Zdaję sobie sprawę, że to jest stare; jednak tutaj byłoby, jak to zrobić, używając tylko modułu 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
źródło