問題

ファイルが存在するディレクトリに書き込まれるかどうかを確認する最もエレガントな方法は何ですか?そうでない場合は、Pythonを使用してディレクトリを作成しますか?ここで私が試したことがあります:

 import os

file_path = "/my/directory/filename.txt"
directory = os.path.dirname(file_path)

try:
    os.stat(directory)
except:
    os.mkdir(directory)       

f = file(filename)
 

どういうわけか、私はos.path.exists(kanja、Brea、Douglasのおかげで)を逃しました。これは私が今持っているものです:

 def ensure_dir(file_path):
    directory = os.path.dirname(file_path)
    if not os.path.exists(directory):
        os.makedirs(directory)
 

"open"のフラグはありますか?これは自動的に発生しますか?

  ベストアンサー

私は良い性質を持つ2つの答えを見て、それぞれに小さな欠陥があるので、私はそれを取る:

os.path.exists を試して、作成のために os.makedirs を考えてみましょう。

 import os
if not os.path.exists(directory):
    os.makedirs(directory)
 

コメントなどに記載されているように、競合状態があります。ディレクトリがos.path.existsos.makedirs呼び出しの間に作成された場合、os.makedirsOSErrorで失敗します。残念ながら、branket-catch OSErrorでは、不十分な権限、フルディスクなどの他の要因によってディレクトリを作成できないため、

1つのオプションは、OSErrorをトラップし、埋め込みエラーコードを調べることです( PythonのOSError から情報を取得するクロスプラットフォームの方法はありますか?):

 import os, errno

try:
    os.makedirs(directory)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise
 

あるいは、2番目の os.path.exists があるかもしれませんが、最初のチェックの後に別のディレクトリが作成され、2番目のチェックの前にそれを削除したとします。

アプリケーションに応じて、同時操作の危険性は、ファイルアクセス許可などの他の要因によって提起される危険性よりも低い場合があります。開発者は、実装を選択する前に、特定のアプリケーションが開発されており、期待される環境についてもっと知る必要があります。

現代のバージョンのPythonは、 FileExistsError (3.3 +)を公開することで、このコードをかなり改善します。

 try:
    os.makedirs("path/to/directory")
except FileExistsError:
    # directory already exists
    pass
 

... os.makedirsというキーワード引数を許可することによって、exist_ok (3.2 +)。

 os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.
 

  同じタグがついた質問を見る

pythonexceptionpathdirectoryoperating-system