[解決済み】ネストされたディレクトリを安全に作成するには?
質問
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さん、Blairさん、Douglasさん、ありがとうございます)。今あるのはこれです。
def ensure_dir(file_path):
directory = os.path.dirname(file_path)
if not os.path.exists(directory):
os.makedirs(directory)
のフラグはありますか?
open()
これを自動的に行うには?
どのように解決するのですか?
Python ≥ 3.5 では、以下のようにします。
pathlib.Path.mkdir
:
from pathlib import Path
Path("/my/directory").mkdir(parents=True, exist_ok=True)
古いバージョンのPythonについては、良い資質を持った2つの答えがあり、それぞれに小さな欠点があるので、私の考えを述べます。
試す
os.path.exists
を、そして
os.makedirs
を作成しました。
import os
if not os.path.exists(directory):
os.makedirs(directory)
コメントなどで指摘されているように、レースコンディションがあります。
os.path.exists
と
os.makedirs
の呼び出しでは
os.makedirs
で失敗します。
OSError
. 残念ながら、ブランケットキャッチの
OSError
というのは、パーミッション不足、フルディスクなど、他の要因によるディレクトリの作成失敗を無視してしまうからです。
一つの選択肢は
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.
関連
-
PythonによるLeNetネットワークモデルの学習と予測
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み] Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか?
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] Pythonでファイルやフォルダを削除する方法は?
-
[解決済み] Pythonでディレクトリが存在するかどうかを確認する方法
-
[解決済み】Git リポジトリに空のディレクトリを追加するには?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
Python 入出力と高次代入の基礎知識
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】終了コード -1073741515 (0xC0000135)でプロセス終了)
-
[解決済み】"No JSON object could be decoded "よりも良いエラーメッセージを表示する。
-
[解決済み] 'int'オブジェクトに'__getitem__'属性がない。
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み] Pythonでmkdir -p機能 [重複]する。
-
[解決済み】新しいフォルダーを作成する方法は?重複