IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

ゼロから歩くPythonの道

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第44回 Pythonの標準モジュールpathlibを使ってパスを取得してみよう (菱沼佑香) 2023年9月

こんにちは、吉政創成 菱沼です。
今回も「きれいなPythonプログラミング(マイナビ出版)」という書籍を利用して学習します。

さて、前回で1章の「エラーの取り扱いと質問の仕方」が終了しましたので、今回から2章に入ります。
2章では「環境設定とコマンドライン」について学習するようです。
プログラミングから離れた内容に思えるのですが、Excelなどのファイルを読み込んだり、生成したりするようなプログラムを作る場合にはパスを正しく記述する必要がありますので、システム環境について基本的なことを知っておく必要があります。
まずは改めて基本的なことを振り返り、pathlibを使ったパスの取得について学習してみたいと思います。

システムの仕組みの基本的なこと

まず環境に関する基本的なこととして、ファイルシステムやディレクトリーについて説明されています。この辺はPCを触る方にとって特に問題はないと思いますので、さらっと一読。

--------
P.18 ◆ファイルシステム
ファイルシステムは、OSがデータを整理して保存・取り出しをする仕組みです。ファイルには、ファイル名(通常は1語)とパスという重要な属性が2つあります。パスは、コンピューター上のファイルの場所を指定します。例えば私のWindows10上には、C:\Users\Al\Documentsというパスに、project.docxというファイル名のファイルがあります。ファイル名の最後のピリオドより後の部分はファイルの拡張子と言い、ファイルの種類を表しています。project.docxというファイルはWordの文書であり、Users、Al、Documentsはいずれもフォルダーです(ディレクトリーとも言います)。
(中略)
C:¥の部分は、他のすべてのフォルダーを含み、ルートフォルダーと言います。Windowsでは、ルートフォルダーはC:¥ドライブと呼ばれています。macOSやLinuxでは、ルートフォルダーは/です。
(中略)
なお、WindowsやmaOSではフォルダー名やファイル名の大文字・小文字は区別されませんが、Linuxでは大文字・小文字が区別されますので注意してください。
--------

fig01

こういう構造のことですね。
ところで、この書籍ではWindowsの表記になりますので、macOSやLinuxをご利用の方は読み替えて頂ければと思います。

Pythonでパスを取得するならpathlib

さて、ExcelやらPDFやらを排出するようなプログラムの場合、特に指定しなければ実行したPythonのプログラムが保存されているディレクトリーに保存されますが、それ以外のディレクトリーに保存したい場合は相対パスか絶対パスで指定してあげなくてはいけません。また、ファイルを読み込んで何かの処理をするようなプログラムの場合にはファイルの在り処を指定してあげる必要があります。
このパスを書く際ですが、自分だけで使う分にはそう凝ったことはしなくてもいいと思いますが、もしプログラムを関係者で共有する可能性があるのなら、どんなOSを使っていても動作するように想定して書く必要が出てくることもあると思います。

Pythonでのパスの処理を行うにはpathlibという標準モジュールを使うのがいまのおすすめのようです。
pathlibはPythonのバージョン3.4から標準モジュールとして追加されたそうですが、それまではパスの処理にosos.pathglobなどの複数のモジュールを利用していたのだとか。このpathlibが追加されてからはこれだけでほぼ網羅できるようになったそうです。

pathlibを使えばディレクトリーやファイルのパスをオブジェクトとして操作できるようになるそうで、例えばパスを取得したり、ファイル名を変更したり、ファイルの読み込み、ファイルかディレクトリーかの判定、ファイル一覧の取得、ファイルやディレクトリーの作成・検索などができるそうです。

pathlibで出来ることは以下のページに一覧としてまとめられていました。ご参考に。
[Python入門]pathlib.Pathクラスによるパス操作

また、os、os.pathで出来ることに対してpathlibがどのツールで対応しているかの表を公式からお借りしました。

fig02

参考:os モジュールにあるツールとの対応付け

Pythonのpathlib、基本の使い方

まずはテキストから。

--------
P.18、19
Windowsでは円記号(¥)でフォルダーやファイル名を区切りますが、maOSやLinuxではフォワードスラッシュ(/)で区切っています。Pythonスクリプトをクロスプラットフォーム、つまりOS等の環境が変わっても同じように動作するように、両方の書き方を用いるのではなく、pathlibモジュールと/演算子を使って書くようにします。
pathlibをインポートするにはfrom pathlib import pathと書くのが一般的です。Pathクラスはpathlibの中でもよく使われるので、このように書いておくとpathlib.Pathと書かずにPathと入力するだけでOKです。フォルダーやファイル名の文字列をPath()に渡すと、そのフォルダーやファイル名のPathオブジェクトを作成できます。式の中で一番左のオブジェクトがPathオブジェクトである限り、/演算子を使ってPathオブジェクトや文字列を結合することができます。
--------

ではここでテキストに合ったサンプルコードを試してみます。

fig03

塩分を気にしてスパムかベーコンどっちかにした方が良いんじゃないかとは思いつつ、結合されてパス形式のオブジェクトになっていることが確認できます。この例では変数に代入されていませんが、変数にしてしまうことも可能です。
(ちなみに私はWindowsなので「WindowsPath」ですが、macOSやLinuxを利用している場合には「PosixPath」で返されるそうです。)

ホームディレクトリーのパスを取得する

では次にpathlibを利用したホームディレクトリーとカレントディレクトリーの取得方法です。

-------
すべてのユーザーはホームフォルダ―またはホームディレクトリーと呼ばれるフォルダーを持っていて、コンピューター上の自分のファイルを管理することができます。path.home()を呼び出すと、ホームフォルダ―のPathオブジェクトが取得できます。
fig04
スクリプトファイルを普通に作成すればホームディレクトリー内のファイルの読み書き権限を持っているはずなので、ホームディレクトリーはPythonプログラムが動作するファイルを保存するのに理想的です。
---------
(macOSなら「/Users」から始まります。)

というように、OSを指定せずに取得できるため、例えば、

fig05

のような感じで、ホームディレクトリーのパスを書かなくても任意のファイル名・ディレクトリー名を付けた状態のパスの取得ができるようになります。

カレントディレクトリー(Current Working Directory, CWD)のパスを取得する

次にカレントディレクトリーのパスの確認方法です。

-------
コンピューター上で動作するすべてのプログラムには、作業ディレクトリー(cwd:カレント・ワーキング・ディレクトリー)があります。ルートフォルダーから始まらないファイル名やパスは、すべてこのcwdにあると考えてよいでしょう。
fig06
-------

この例で出た結果は多分、IDLEのインタラクティブモードでコードを実行しているから、Pythonのフォルダーが指定されているのだと思います。
実際に使うとすれば何かしらのファイルを読み込んで作業をしている状態だと思いますので、プログラムファイルが保存されているディレクトリー名が表示されるんだと思います。

なので例えば、

fig07

のようにカレントディレクトリーの中にあるtest.txtというファイルのパスを取得することができます。
ちなみに、osモジュールのos.chdirを合わせて利用すればカレントディレクトリーを変更することもできるそうですが、ディレクトリーが変更されるとプログラムへ影響が出る可能性があるため、きちんと確認が必要です。
カレントディレクトリーを移動させるサンプルはこちら。

fig08

まずPath.cwdでカレントディレクトリーのパスをオブジェクトとして取得し、os.chdirでカレントディレクトリーを変えます。最後のPath.cwdで現在のカレントディレクトリーのパスを確認しています。
元のディレクトリーに戻るにはまたos.chdirで指定します。うっかり忘れて作業しないようにしたいですね。
なお、存在しないディレクトリーに変更しようとした場合にはエラーが表示されます。

テキストで紹介されているのは上記の2点ですが、pathlibでよく利用される操作がまとめられているサイトを見つけました。ご参考までに。

参考サイト:
pathlib --- オブジェクト指向のファイルシステムパス|公式
Pythonをローカル環境で開発するなら気を付けたいこととpathlibのすすめ
【Python】pathlibの特徴と使い方 - 頻繁に使われる操作を厳選 -
【python】pathlibの使い方【pathオブジェクトによるファイル操作】

ところで、個人で開発する際にはデスクトップに保存するのもいいのですが、ホームディレクトリー配下に開発用のものを保存する用の英語名のフォルダーを作るのがおすすめだという事を以前教えてもらいました。作業用フォルダーをどこに置こうか悩んでいる方はぜひご検討ください。
そういえば、私はWindowsユーザーでOneDriveも使っているのですが、プログラムでのディレクトリーの指定で、どのOSでも使えることを前提とする場合の書き方を考えていた時にOneDriveに阻まれて面倒くさかったのを思い出しました。そもそもOneDriveの設定を外すという手もあるようですが、設定を外す際には注意事項があるようなので、ご注意ください。

それでは今回はこちらで終了です。お付き合いいただきありがとうございました。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes