Chcę usunąć wszystkie pliki z rozszerzeniem .bak
w katalogu. Jak mogę to zrobić w Pythonie?
shutil.rmtree(path)
można użyć .
Chcę usunąć wszystkie pliki z rozszerzeniem .bak
w katalogu. Jak mogę to zrobić w Pythonie?
shutil.rmtree(path)
można użyć .
Odpowiedzi:
Przez os.listdir
i 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
.
Służy os.chdir
do zmiany katalogu. Służy glob.glob
do 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.unlink
do usunięcia plików. (PS. os.unlink
I os.remove
są 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)
W Pythonie 3.5 os.scandir
lepiej jest sprawdzić atrybuty lub typ pliku - zobacz os.DirEntry
wł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 DirEntry
zawiera już pełną ścieżkę do pliku.
if file.name.endswith(".bak"):
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")
W systemie Linux i macOS możesz uruchomić proste polecenie w powłoce:
subprocess.run('rm /tmp/*.bak', shell=True)
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))