2009-06-24 35 views
29

Cercando di rimuovere tutti i file in una determinata directory mi dà l'errore follwing:Rimuovere tutti i file in una directory

OSError: [Errno 2] No such file or directory: '/home/me/test/*' 

Il codice sto correndo è:

import os 
test = "/home/me/test/*" 
os.remove(test) 
+0

documento ufficiale del os.walk ha ancora una demo :) http: // docs. python.org/library/os.html#os.walk – sunqiang

risposta

38

os.remove() non funziona su una directory e os.rmdir() funziona solo su una directory vuota. E Python non espanderà automaticamente "/ home/me/test/*" come fanno alcune shell.

È possibile utilizzare shutil.rmtree() nella directory per farlo, tuttavia.

import shutil 
shutil.rmtree('/home/me/test') 

fare attenzione in quanto rimuove i file e le sottodirectory pure.

+2

importazione shutil; shutil.rmtree ('/ home/me/test') –

+14

Si noti che l'uso di shutil.rmtree() cancellerà anche la cartella alla fine del percorso dato (non cancella il contenuto della directory che cancella la directory) – James

+0

che non fa spieghiamo perché '/ home/me/test/*' non è accettato da 'os.remove'. Ho modificato la risposta. –

0

os. remove rimuoverà solo un singolo file.

Per rimuovere con i caratteri jolly, è necessario scrivere la propria routine che gestisce questo.

Ci sono quite a few suggested approaches elencati in questa pagina del forum.

7

Poiché * è un costrutto di shell. Python sta letteralmente cercando un file chiamato "*" nella directory/home/me/test. Usa listdir per ottenere prima un elenco dei file e poi chiama remove su ognuno di essi.

10

os.remove non risolve i modelli in stile Unix. Se siete su un sistema unix-like è possibile:

os.system('rm '+test) 

altro si può:

import glob, os 
test = '/path/*' 
r = glob.glob(test) 
for i in r: 
    os.remove(i) 
+0

os.system ha molti avvertimenti, incluso non risolvere i glob pattern (dato che passa semplicemente la linea alla shell); glob restituisce sia le directory che i file (che os.remove non gestisce) –

+0

la migliore risposta finora: –

1

stella si espande dalla shell Unix. La tua chiamata non sta accedendo alla shell, sta semplicemente cercando di rimuovere un file con il nome che termina con la stella

0

shutil.rmtree() per la maggior parte dei casi. Ma non funziona in Windows per i file readonly. Per Windows importare i moduli win32api e win32con da PyWin32.

def rmtree(dirname): 
    retry = True 
    while retry: 
     retry = False 
     try: 
      shutil.rmtree(dirname) 
     except exceptions.WindowsError, e: 
      if e.winerror == 5: # No write permission 
       win32api.SetFileAttributes(dirname, win32con.FILE_ATTRIBUTE_NORMAL) 
       retry = True 
5

Un altro modo in cui ho fatto questo:

os.popen('rm -f ./yourdir') 
+0

non portatile e 'rm -f directory' non funziona. Mi chiedo perché questo sia svalutato così tanto. –

0

Si prega di vedere la mia risposta qui:

https://stackoverflow.com/a/24844618/2293304

Si tratta di una soluzione a lungo e brutto, ma affidabile ed efficiente.

Risolve alcuni problemi che non sono contemplate dalle altre answerers:

  • Gestisce correttamente i collegamenti simbolici, tra cui non chiamare shutil.rmtree() su un link simbolico (che passerà il test os.path.isdir() se si collega a un directory).
  • Gestisce i file di sola lettura in modo corretto.
+0

in questo caso, il modo migliore è contrassegnare come duplicato. –

0
#python 2.7 
import tempfile 
import shutil 
import exceptions 
import os 

def TempCleaner(): 
    temp_dir_name = tempfile.gettempdir() 
    for currentdir in os.listdir(temp_dir_name): 
     try: 
      shutil.rmtree(os.path.join(temp_dir_name, currentdir)) 
     except exceptions.WindowsError, e: 
      print u'Не удалось удалить:'+ e.filename 
2

Anche se questa è una vecchia questione, penso che nessuno di essi ha già risposto con questo approccio:

#python 2.7 
import os 

filesToRemove = [f for f in os.listdir('/home/me/test')] 
os.remove(f) for f in files 
+2

È necessario includere il percorso completo del file quando si utilizza 'os.remove()', quindi si dovrebbe fare 'os.remove (os.path.join ("/home/me/test ", f)) 'perché funzioni. – deef

+0

più la riga 'os.remove (f) for f in files' non è una sintassi valida. Non tutto usa la comprensione. –

+0

Mi piace molto questa risposta, usando le chiamate 'os'. L'ho usato come base del mio lavoro: 'filesToRemove = [f for f in os.listdir (self.my_folder)] per f in filesToRemove: os.remove (os.path.join (self.my_folder, f)) '(indentazione richiesta). – wmorrison365

Problemi correlati