Come sovrascrivere una cartella, se è già presente al momento della creazione con makedirs?

Il seguente codice mi permette di creare una directory se non esiste già.

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

Cartella sarà utilizzato da un programma per scrivere file di testo nella cartella. Ma voglio iniziare con una nuova cartella vuota la prossima volta che il mio programma si apre.

C’è un modo per sovrascrivere la cartella (e crearne uno nuovo con lo stesso nome), se esiste già?

  • Va notato, anche se non importa a voi, che tutte le risposte qui sono condizioni di gara (e mentre non è possibile eliminare completamente come poste, si poteva fare meglio, utilizzando EAFP).
InformationsquelleAutor Shankar Kumar | 2012-07-26



6 Replies
  1. 13
    import shutil
    
    path = 'path_to_my_folder'
    if not os.path.exists(path):
        os.makedirs(path)
    else:
        shutil.rmtree(path)           #removes all the subdirectories!
        os.makedirs(path)

    Come? Date un’occhiata a shutil‘s Python libreria!

    • Questo funziona anche.. Ma questo è abbastanza common module? Questo codice deve essere implementato su molte macchine..
    • Sì. shutil è parte di Python‘s costruito in librerie dal Python 2.4. Io personalmente penso shutil è meglio di os a causa di alcune semplificazioni si fa portare in.
  2. 2

    os.path.exists(dir) controllo è consigliato, ma può essere evitato utilizzando ignore_errors

    dir = 'path_to_my_folder'
    shutil.rmtree(dir, ignore_errors=True)
    os.makedirs(dir)
  3. 1

    Solo 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
    • Grazie, questo funziona alla grande! Ti dispiace spiegare la logica che c’è dietro? Sono un principiante quindi sto cercando di imparare quanto più possibile!
    • Questo verrebbe a mancare, però, se si aveva sottodirectory nella directory che si sta cercando di eliminare. Poi ci si vuole chiamare os.walk di correzione. Una soluzione più semplice sarebbe quella di utilizzare shutil.rmtree.
    • Vorrei che essere immune alle condizioni di gara?
  4. 0

    EAFP (vedere qui) 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)
    • Benvenuti a Stack overflow! Questo è venuto da me per la recensione come la tua prima risposta. Quando si risponde ad una domanda con un’accettata risposta, vale la pena di evidenziare ciò che si aggiunge alle soluzioni esistenti. In questo caso – può spiegare perché si ritiene che questo codice è immune alle condizioni di gara? Per esempio, cosa succede se un file viene scritto directory dopo la chiamata a glob.iglob() – puoi descrivere un motivo per cui la soluzione è meno soggetto a condizione di competizione? Inoltre: si potrebbe pensare di spiegare che cosa EAFP sta per. NB ho re-inviato a cura commento a causa di un errore in originale
    • Sì, hai ragione, questo codice non è immune alle condizioni di gara. La nuova versione, a mio parere, di soddisfare questo requisito

Lascia un commento