[解決済み】Pythonでフルパスのファイル名をビルドする
質問
モジュールにファイルのパス名を渡す必要があります。 ディレクトリ名、ベースファイル名、ファイルフォーマット文字列から、どのようにファイルパスを構築すればよいでしょうか?
ディレクトリは、呼び出し時に存在するかどうかわかりません。
例えば
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ではファイル名の一部に過ぎず、組み込みの意味はありません。
関連
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonでファイル名から拡張子を抽出する
-
[解決済み] フルパスでモジュールをインポートするには?
-
[解決済み] Pythonでパスから拡張子なしでファイル名を取得する方法は?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Bashでファイル名と拡張子を抽出する。
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
ピロウズ画像色処理の具体的な活用方法
-
任意波形を生成してtxtで保存するためのPython実装
-
Pythonショートビデオクローラーチュートリアル
-
Pythonの画像ファイル処理用ライブラリ「Pillow」(グラフィックの詳細)
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】ilocが「IndexError: single positional indexer is out-of-bounds」を出す。
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み] 'int'オブジェクトに'__getitem__'属性がない。
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】ValueError: xとyは同じサイズでなければならない