Voglio eliminare tutti i file con l'estensione .bakin una directory. Come posso farlo in Python?
shutil.rmtree(path)potrebbe essere utilizzato .
Voglio eliminare tutti i file con l'estensione .bakin una directory. Come posso farlo in Python?
shutil.rmtree(path)potrebbe essere utilizzato .
Risposte:
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))
O via glob.glob:
import glob, os, os.path
filelist = glob.glob(os.path.join(mydir, "*.bak"))
for f in filelist:
os.remove(f)
Assicurati di essere nella directory corretta, eventualmente utilizzando os.chdir.
Utilizzare os.chdirper cambiare directory. Utilizzare glob.globper generare un elenco di nomi di file che terminano con ".bak". Gli elementi dell'elenco sono solo stringhe.
Quindi è possibile utilizzare os.unlinkper rimuovere i file. (PS. os.unlinkE os.removesono sinonimi per la stessa funzione.)
#!/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)
In Python 3.5, os.scandirè meglio se è necessario controllare gli attributi o il tipo di file: vedere le os.DirEntryproprietà dell'oggetto restituito dalla funzione.
import os
for file in os.scandir(path):
if file.name.endswith(".bak"):
os.unlink(file.path)
Ciò non richiede inoltre la modifica delle directory poiché ognuna DirEntryinclude già l'intero percorso del file.
if file.name.endswith(".bak"):
puoi creare una funzione. Aggiungi maxdepth a piacere per attraversare le sottodirectory.
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")
Prima di tutto glob , quindi scollegare .
Su Linux e macOS è possibile eseguire un semplice comando sulla shell:
subprocess.run('rm /tmp/*.bak', shell=True)
Mi rendo conto che questo è vecchio; tuttavia, ecco come farlo usando solo il modulo 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))