1. ホーム
  2. パイソン

[解決済み】Pythonでフルパスのファイル名をビルドする

2022-04-29 02:11:37

質問

モジュールにファイルのパス名を渡す必要があります。 ディレクトリ名、ベースファイル名、ファイルフォーマット文字列から、どのようにファイルパスを構築すればよいでしょうか?

ディレクトリは、呼び出し時に存在するかどうかわかりません。

例えば

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

解決方法は?

これは問題なく動作します。

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

を覚えておいてください。 os.path.join() が存在するのは、オペレーティングシステムによってパス区切り文字が異なるからです。その違いを滑らかにすることで、クロスプラットフォームのコードがOSごとの特殊なケースでごちゃごちゃにならないようにするのです。ファイル名の "extensions"(脚注参照)については、どのOSでも常にドット文字で残りの部分と接続されているため、このような処理を行う必要性はありません。

もし、とにかく関数を使うと気分が良くなる(そして、無駄にコードを複雑にするのが好き)なら、こんな方法もあります。

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

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

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

この方法は、たまたま パスリブ この質問があった数年後に python 3.4 で導入されたものです。後方互換性を必要としない新しいコードでは、これを行うことができます。

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

を使いたくなるかもしれません。 Path() の代わりに PurePath() ローカルOSのパスだけを処理する場合。元の質問の背景にあるクロスプラットフォームの問題を考えると、その選択には疑問が残ります。

警告 pathlib の with_suffix() を使用します。この方法は base_filename が含まれている場合、そのドットは


脚注:MicorsoftのOS以外では、ファイル名の"extension"というものは存在しません。Windowsでのその存在は、MS-DOSとFATに由来するもので、CP/Mから借用したものですが、CP/Mは何十年も前に消滅しています。私たちの多くが見慣れているドットプラス3文字は、他のすべてのモダンなOSではファイル名の一部に過ぎず、組み込みの意味はありません。