2012-07-26 11 views
16

Der folgende Code ermöglicht es mir, ein Verzeichnis zu erstellen, wenn es nicht bereits vorhanden ist.Wie überschreibt man einen Ordner, wenn er bereits existiert, wenn er mit Makedirs erstellt wird?

Der Ordner wird von einem Programm verwendet, um Textdateien in diesen Ordner zu schreiben. Aber ich möchte mit einem brandneuen, leeren Ordner beginnen, wenn das Programm das nächste Mal geöffnet wird.

Gibt es eine Möglichkeit, den Ordner zu überschreiben (und einen neuen mit dem gleichen Namen zu erstellen), wenn er bereits existiert?

+1

Es sollte beachtet werden, wenn es nicht für Sie können, dass alle der hier Antworten Rennbedingungen haben (und auch wenn es nicht wirklich ist möglich, um sie vollständig zu beseitigen, wie Sie gestellt, könnten Sie es besser machen, indem Sie EAFP verwenden). – Julian

Antwort

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) 

Wie wäre das? Werfen Sie einen Blick auf shutil 's Python Bibliothek!

+0

Das funktioniert auch .. Aber ist das ein ziemlich übliches Modul? Dieser Code muss auf vielen Computern implementiert werden. –

+0

@ShankarKumar Ja. 'shuthil' ist Teil von' Python's eingebauten Bibliotheken seit 'Python 2.4'. Ich persönlich denke 'shuthil' ist besser als' os' aufgrund einiger Vereinfachungen, die es bringt. – cybertextron

0

Sagen Sie einfach

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

Danke, das funktioniert super! Macht es Ihnen etwas aus, die Logik dahinter zu erklären? Ich bin ein Anfänger und versuche so viel wie möglich zu lernen! –

+0

Dies würde jedoch fehlschlagen, wenn Sie Unterverzeichnisse in dem Verzeichnis haben, das Sie löschen möchten. Dann solltest du 'os.walk' anrufen, um das zu beheben. Eine einfachere Lösung wäre die Verwendung von 'shuthil.rmtree'. – inspectorG4dget

+0

Wäre das immun gegen Rassenbedingungen? –

0

EAFP (see about it here) Version

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

Willkommen bei Stack Überlauf! Das kam für mich zur Überprüfung als erste Antwort. Wenn Sie eine alte Frage mit einer akzeptierten Antwort beantworten, sollten Sie hervorheben, was Sie zu den bestehenden Lösungen hinzufügen. In diesem Fall - können Sie erklären, warum Sie glauben, dass dieser Code immun gegen die Rassenbedingungen ist? Zum Beispiel - was passiert, wenn eine Datei nach dem Aufruf von glob.iglob() in das Verzeichnis geschrieben wird - können Sie einen Grund beschreiben, warum Ihre Lösung weniger rennabhängig ist? Außerdem: Sie könnten darüber nachdenken zu erklären, wofür EAFP steht. * NB: Ich habe den Kommentar aufgrund eines Fehlers im Original neu gepostet * –

+0

@JRichardSnape Ja, Sie haben recht, dieser Code ist nicht immun gegen die Rennbedingungen. Die neue Version erfüllt meiner Meinung nach diese Anforderung –