ディレクトリが存在するかどうかを確認し、必要に応じて作成しますか?
これに対する直接の答えは、他のユーザーまたはプロセスがディレクトリをいじるのを期待しない単純な状況を想定しています:
if not os.path.exists(d):
os.makedirs(d)
または、ディレクトリの作成が競合状態の影響を受ける場合(つまり、パスが存在することを確認した後、他の何かがすでに作成している可能性がある場合)は、次のようにします。
import errno
try:
os.makedirs(d)
except OSError as exception:
if exception.errno != errno.EEXIST:
raise
しかし、おそらくさらに優れたアプローチは、次を介して一時ディレクトリを使用することにより、リソース競合の問題を回避することですtempfile
。
import tempfile
d = tempfile.mkdtemp()
オンラインドキュメントの要点は次のとおりです。
mkdtemp(suffix='', prefix='tmp', dir=None)
User-callable function to create and return a unique temporary
directory. The return value is the pathname of the directory.
The directory is readable, writable, and searchable only by the
creating user.
Caller is responsible for deleting the directory when done with it.
Python 3.5の新機能:pathlib.Path
ありexist_ok
Path
パスで使用したい多くのメソッドを持つ新しいオブジェクト(3.4以降)があり、そのうちの1つはですmkdir
。
(コンテキストでは、毎週の担当者をスクリプトで追跡しています。同じデータで1日に複数回スタックオーバーフローにヒットすることを回避できるようにするスクリプトのコードの関連部分を次に示します。)
まず、関連するインポート:
from pathlib import Path
import tempfile
今は対処する必要はありません。os.path.join
パスのパーツを/
:でです。
directory = Path(tempfile.gettempdir()) / 'sodata'
次に、べき等にディレクトリが存在することを確認します- exist_ok
べき引数はPython 3.5で表示されます。
directory.mkdir(exist_ok=True)
ここに関連する部分があります ドキュメントのとおりです。
場合はexist_ok
trueで、FileExistsError
例外は(同じ動作を無視されます。POSIX mkdir -p
コマンド)が、最後のパスコンポーネントは、既存の非ディレクトリファイルでない場合のみ。
これがスクリプトのもう少しです-私の場合、私は競合状態の影響を受けません、私はディレクトリ(または含まれているファイル)が存在することを期待するプロセスが1つだけあり、削除しようとしているものはありませんディレクトリ。
todays_file = directory / str(datetime.datetime.utcnow().date())
if todays_file.exists():
logger.info("todays_file exists: " + str(todays_file))
df = pd.read_json(str(todays_file))
Path
オブジェクトを強制する必要があります str
str
パスがそれらを使用できることを期待する他のAPI が使用する前必要があります。
おそらく、パンダを更新して、抽象基本クラスのインスタンスを受け入れる必要がありますos.PathLike
。