ディレクトリが存在するかどうかを確認し、必要に応じて作成しますか?
これに対する直接的な答えは、他のユーザーやプロセスがディレクトリをいじることがないと予想される単純な状況を想定すると、次のようになります。
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 日に複数回 Stack Overflow にアクセスすることを回避できるスクリプトのコードの関連部分です。)
最初に関連するインポート:
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
を期待する他のAPI がそれらを使用できるようになる前に、オブジェクトを強制する必要があります。str
おそらく、抽象基本クラスのインスタンスを受け入れるように Pandas を更新する必要がありますos.PathLike
。