2012-07-26 9 views
16

Il seguente codice mi consente di creare una directory se non esiste già.Come sovrascrivere una cartella se già esiste quando la si crea con i makedir?

dir = 'path_to_my_folder' 
if not os.path.exists(dir): 
    os.makedirs(dir) 

La cartella verrà utilizzato da un programma per scrivere i file di testo in quella cartella. Ma voglio iniziare con una cartella nuova e vuota la prossima volta che il mio programma si apre.

C'è un modo per sovrascrivere la cartella (e crearne una nuova, con lo stesso nome) se già esiste?

+1

Va notato, anche se potrebbe non importa a voi, che tutte le risposte qui hanno condizioni di gara (e anche se non è davvero possibile eliminarli completamente come posato, si potrebbe fare meglio, usando EAFP). – Julian

risposta

25
dir = 'path_to_my_folder' 
if os.path.exists(dir): 
    shutil.rmtree(dir) 
os.makedirs(dir) 
7
import shutil 

dir = 'path_to_my_folder' 
if not os.path.exists(dir): 
    os.makedirs(dir) 
else: 
    shutil.rmtree(dir)   #removes all the subdirectories! 
    os.makedirs(dir) 

Che ne dici? Dai un'occhiata alla libreria PythonPython!

+0

Anche questo funziona .. Ma questo è un modulo abbastanza comune? Questo codice deve essere implementato su molte macchine. –

+0

@ShankarKumar Sì. 'shutil' fa parte delle librerie incorporate di' Python' da 'Python 2.4'. Personalmente ritengo che 'shutil' sia meglio di' os' a causa di alcune semplificazioni che esso comporta. – cybertextron

0

Basta dire

dir = 'path_to_my_folder' 
if not os.path.exists(dir): # if the directory does not exist 
    os.makedirs(dir) # make the directory 
else: # the directory exists 
    #removes all files in a folder 
    for the_file in os.listdir(dir): 
     file_path = os.path.join(dir, the_file) 
     try: 
      if os.path.isfile(file_path): 
       os.unlink(file_path) # unlink (delete) the file 
     except Exception, e: 
      print e 
+0

Grazie, funziona alla grande! Ti spiace spiegare la logica dietro? Sono un principiante quindi sto cercando di imparare il più possibile! –

+0

Questo fallirebbe, se avessi sottodirectory nella directory che stai cercando di cancellare. Quindi dovresti chiamare 'os.walk' per risolvere il problema. Una soluzione più semplice sarebbe usare 'shutil.rmtree'. – inspectorG4dget

+0

Sarebbe immune alle condizioni della gara? –

0

EAFP (see about it here) versione

import errno 
import os 
from shutil import rmtree 
from uuid import uuid4 

path = 'path_to_my_folder' 
temp_path = os.path.dirname(path)+'/'+str(uuid4()) 
try: 
    os.renames(path, temp_path) 
except OSError as exception: 
    if exception.errno != errno.ENOENT: 
     raise 
else: 
    rmtree(temp_path) 
os.mkdir(path) 
+0

Benvenuti in overflow dello stack! Questo mi è venuto in mente per la tua prima risposta. Quando rispondi a una vecchia domanda con una risposta accettata, vale la pena sottolineare ciò che stai aggiungendo alle soluzioni esistenti. In questo caso, puoi spiegare perché ritieni che questo codice sia immune alle condizioni della gara? Per esempio - cosa succede se un file viene scritto nella directory dopo la chiamata a glob.iglob() - puoi descrivere un motivo per cui la tua soluzione è meno soggetta alle condizioni di gara? Inoltre: potresti pensare a spiegare cosa rappresenta EAFP. * NB Ho re-postato il commento modificato a causa di un errore nell'originale * –

+0

@JRichardSnape Sì, hai ragione, questo codice non è immune alle condizioni della gara. La nuova versione, a mio parere, soddisfa questo requisito –

Problemi correlati