2012-07-26 7 views
16

Poniższy kod pozwala mi utworzyć katalog, jeśli jeszcze nie istnieje.Jak zastąpić folder, jeśli już istnieje podczas tworzenia go z makedirs?

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

Folder będzie używany przez program do zapisywania plików tekstowych do tego folderu. Ale chcę zacząć od zupełnie nowego, pustego folderu, gdy następnym razem mój program się otworzy.

Czy istnieje sposób na zastąpienie folderu (i utworzenie nowego o tej samej nazwie), jeśli już istnieje?

+1

Należy zauważyć, choć może nie dla ciebie znaczenie, że wszystkie odpowiedzi mają tutaj warunki Race (a gdy to naprawdę nie jest możliwe całkowite ich wyeliminowanie, możesz zrobić to lepiej, używając EAFP). – Julian

Odpowiedz

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) 

Jak o tym? Spójrz na bibliotekę shutil 'Python!

+0

To również działa .. Ale czy jest to dość powszechny moduł? Ten kod musi zostać zaimplementowany na wielu komputerach. –

+0

@ShankarKumar Tak. 'shutil' jest częścią wbudowanych bibliotek' Python' od 'Python 2.4'. Osobiście uważam, że 'shutil' jest lepszy niż' os' z powodu pewnych uproszczeń, które wprowadza. – cybertextron

0

Wystarczy powiedzieć

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

Dzięki, działa to świetnie! Czy masz coś przeciwko tłumaczeniu logiki? Jestem początkującym, więc staram się uczyć jak najwięcej! –

+0

To by się jednak nie udało, gdybyś miał podkatalogi w katalogu, który próbujesz usunąć. Następnie chcesz wywołać 'os.walk', aby to naprawić. Prostszym rozwiązaniem byłoby użycie 'shutil.rmtree'. – inspectorG4dget

+0

Czy to byłoby odporne na warunki wyścigu? –

0

EAFP (see about it here) wersja

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

Witamy w przepełnieniu stosu! To przyszło mi do recenzji jako pierwsza odpowiedź. Odpowiadając na stare pytanie z zaakceptowaną odpowiedzią, warto podkreślić, co dodajesz do istniejących rozwiązań. W takim przypadku - czy możesz wyjaśnić, dlaczego uważasz, że ten kod jest odporny na warunki wyścigu? Na przykład - co się stanie, jeśli plik zostanie zapisany w katalogu po wywołaniu glob.iglob() - czy możesz opisać przyczynę, dla której Twoje rozwiązanie jest mniej zależne od stanu wyścigu? Ponadto: możesz pomyśleć o wytłumaczeniu, co oznacza EAFP. * NB Ponownie opublikowałem zredagowany komentarz z powodu błędu w oryginalnym * –

+0

@JRichardSnape Tak, masz rację, ten kod nie jest odporny na warunki wyścigu. Nowa wersja, moim zdaniem, spełnia ten wymóg –

Powiązane problemy