部分(フォルダへのパス、名前、拡張子など)からファイルへの完全なパスを作成するにはどうすればよいでしょうか? 質問する

部分(フォルダへのパス、名前、拡張子など)からファイルへの完全なパスを作成するにはどうすればよいでしょうか? 質問する

モジュールにファイル パス名を渡す必要があります。ディレクトリ名、基本ファイル名、およびファイル形式文字列からファイル パスを構築するにはどうすればよいですか?

呼び出し時にディレクトリが存在する場合と存在しない場合があります。

例えば:

dir_name='/home/me/dev/my_reports'
base_filename='daily_report'
format = 'pdf'

文字列を作成する必要があります'/home/me/dev/my_reports/daily_report.pdf'

手動で部分を連結するのは良い方法ではないようです。私は次のことを試しましたos.path.join:

join(dir_name,base_filename,format)

しかし、それは

/home/me/dev/my_reports/daily_report/pdf

ベストアンサー1

これはうまく動作します:

os.path.join(dir_name, base_filename + '.' + filename_suffix)

異なるオペレーティング システムでは異なるパス区切り文字が使用されるためだけに存在することに注意してくださいos.path.join()。これにより、その違いが解消され、クロスプラットフォーム コードが各 OS の特殊なケースで煩雑になることはありません。ファイル名の「拡張子」(脚注を参照) については、これを実行する必要はありません。これは、それらを実装するすべての OS で、常にドット文字が先頭に付くためです。

とにかく関数を使う方が気分がいい場合 (そしてコードを不必要に複雑にするのが好きな場合)、次のようにすることができます。

os.path.join(dir_name, '.'.join((base_filename, filename_suffix)))

コードをきれいに保ちたい場合は、サフィックスにドットを含めるだけです。

suffix = '.pdf'
os.path.join(dir_name, base_filename + suffix)

このアプローチは、この質問が出された数年後に Python 3.4 で導入されたpathlibのサフィックス規則とも互換性があります。下位互換性を必要としない新しいコードでは、次の操作を実行できます。

suffix = '.pdf'
pathlib.PurePath(dir_name, base_filename + suffix)

Path()ローカル OS のパスのみを処理する場合は、 の代わりに短い を使用するように誘惑されるかもしれませんPurePath()。元の質問の背後にあるクロスプラットフォームの問題を考えると、その選択には疑問を感じます。

警告: この目的では pathlib を使用しないでください。ドットが含まれていると、with_suffix()そのメソッドは破損します。base_filename


脚注: Microsoft オペレーティング システム以外では、ファイル名の「拡張子」というものは存在しません。Windows で拡張子が存在するのは、数十年前に廃止された CP/M から借用した MS-DOS と FAT によるものです。私たちの多くが見慣れているドットと 3 文字の組み合わせは、他のすべての最新 OS のファイル名の一部にすぎず、組み込みの意味はありません。

おすすめ記事