2012-07-26 4 views
16

次のコードでは、ディレクトリが存在しない場合は作成できます。makedirsでフォルダを作成するときにフォルダがすでに存在する場合、そのフォルダを上書きする方法はありますか?

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

このフォルダは、テキストファイルをそのフォルダに書き込むためにプログラムによって使用されます。しかし、私は次回に自分のプログラムが開くときに、新しい、空のフォルダから始めたいと思う。

すでに存在する場合は、フォルダを上書きする(同じ名前の新しいフォルダを作成する)方法はありますか?そのことについて

+1

それは本当にありませんしながら、すべての答えがここに競合状態を持っている(とすることを、あなたには関係ないかもしれませんが、注意すべきですEAFPを使用することで、それらを完全に排除することができます。 – Julian

答えて

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) 

どのように? shutilさんのPythonライブラリーをご覧ください。

+0

これも機能します..しかしこれはかなり一般的なモジュールですか?このコードは多くのマシンで実装する必要があります。 –

+0

@ShankarKumarはい。 'shutil'は' Python 2.4 '以降の 'Python'ライブラリの一部です。私は個人的には、 'shutil'が' os'よりも優れていると思います。 – cybertextron

0

ちょうど言う

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

ありがとう、これは素晴らしいです!あなたはそれの背後にある論理を説明してもらえますか?私は初心者ですので、できる限り学びたいと思っています! –

+0

削除しようとしているディレクトリにサブディレクトリがある場合、これは失敗します。そして、それを修正するために 'os.walk'を呼びたいと思います。もっと簡単な解決法は、 'shutil.rmtree'を使うことです。 – inspectorG4dget

+0

それは競争条件の影響を受けませんか? –

0

EAFP (see about it here)バージョン

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

ようこそスタックオーバーフロー!これは私の最初の答えとしてレビューのために私に来た。受け入れられた答えで古い質問に答えるときは、既存のソリューションに何を追加しているのかを強調する価値があります。このケースでは、なぜこのコードがレースコンディションの影響を受けないと思われるのか説明できますか?たとえば、glob.iglob()の呼び出し後にディレクトリにファイルを書き込むとどうなりますか?あなたのソリューションが競合条件の影響を受けにくい理由を説明できますか?また、EAFPが何を表しているのかを説明することも考えられます。 * NB私はオリジナルのエラーのため編集されたコメントを再投稿しました* –

+0

@JRichardSnapeはい、そうです、このコードは競合条件に影響されません。私の意見では、この新しいバージョンはこの要件を満たしています –

関連する問題