Developer

【Python連載】osモジュールを使ったパスの確認
2021.08.31
Lv1

【Python連載】osモジュールを使ったパスの確認

Pythonは、オブジェクト指向と呼ばれるプログラミング言語の一つです。
今回は、これまでに紹介したテキストファイルの読み込み・書き込みに関する補足的な内容として、osモジュールを使ったパスの確認について扱っていきます。


対象のファイルがカレントディレクトリ以外にある場合について

前回までの記事で、テキストファイルの操作は、カレントディレクトリにあるファイルを対象として行ってきました。
読み込み・書き込み対象のファイルは、カレントディレクトリに置かれていないファイルを対象とすることも可能です。

次のプログラムを見てみましょう。

file = open("test/sample.txt","w") #testディレクトリ内にsample.txtというファイルを上書きモードで作成
file.write("1行目です\n2行目です")
file.close()

カレントディレクトリから一つ下の階層にあるtestというディレクトリに、sample.txtというファイルを上書きモードで作成しました。
このように、ファイル名だけではなくディレクトリ名も指定することで、カレントディレクトリ以外の場所にあるファイルを扱うことが出来ます。

ただし、ファイルの読み込み・書き込みをするようなプログラムを作成する上では、指定したファイルやディレクトリが存在しないにはエラーが発生してしまう場合があります。

file = open("test/sample.txt","w") #存在しないパスを指定
file.write("1行目です\n2行目です")
file.close()
C:\Python> python 14-5-2.py
FileNotFoundError: [Errno 2] No such file or directory: ‘hoge/sample.txt’

このように存在しないパスを指定してしまった場合にはエラーが発生してしまい、思い通りの結果を得ることは出来ません。
open()の上書きモードや追記モードは、ファイルが存在しない場合は新規にファイルを作ってくれますが、残念ながら当該名ディレクトリが存在しない場合に新規にディレクトリを作ってくれるわけではありません。

とはいえ本記事のような簡単なプログラムであればファイル名やディレクトリ名を間違えることは少ないと思いますが・・・プログラムが大規模になってくるとその限りではありません。
事前に存在をチェックすることで、予期せぬ例外を防ぐことにも繋がります。

では、どうやって存在のチェックを行うかといいますと・・・
osモジュールというものを使用します。

ファイルやディレクトリが存在するかをチェックする

osモジュールとは、ファイルやディレクトリの操作を行うことができるモジュールです。
osモジュールを使用すれば、ファイルのパスを取得出来たり、あるいはディレクトリを新規に作成したり等が出来ます。

それではまず、ディレクトリが存在するかどうかのチェックを行ってみましょう。
osモジュールのpath.exists()を使用します。

import os #osモジュールをインポート

print(os.path.exists("./test")) #testというディレクトリは実際に存在している
print(os.path.exists("./hoge")) #hogeというディレクトリは存在していない
C:\Python> python 14-5-3.py
True
False

このように、結果はTrueかFalseで返ってきます。
次に、ファイルが存在するかどうかのチェックも同様に行ってみます。

import os #osモジュールをインポート

print(os.path.exists("./test/sample.txt")) #testというディレクトリはsample.txtは実際に存在している
print(os.path.exists("./test/hoge.txt")) #testというディレクトリはhoge.txtは存在していない
C:\Python> python 14-5-4.py
True
False

それでは、osモジュールのpath.exists()を使用して、ファイルの読み書きに関するプログラムを少し工夫して書いてみましょう。

もしも保存先として指定したディレクトリが存在しない場合に、新規にディレクトリを作成した上でファイルの保存を行う形にしてみます。
ディレクトリの作成には、osモジュールのmakedirs()を使用します。

import os #osモジュールをインポート

directory = "./test/" #ディレクトリを指定

if not os.path.exists(directory): #指定のディレクトリが存在しない場合
os.makedirs(directory) #当該名のディレクトリを新規に作成する

file = open(directory + "sample.txt","w") #./test/sample.txtを上書きモードで開く
file.write("ディレクトリの存在をチェックした上で保存")
file.close()

上記を実行すると、変数directoryで指定したディレクトリが存在しない場合には、新規にディレクトリを作成した上で処理が実行されます。

このように予期せぬ例外の発生を防ぐためにも存在チェックをした上で処理を実行するということも大事になってきますので、覚えておきましょう。


まとめ

読み込み・書き込み対象のファイルは、パスを指定することで別のディレクトリのファイルを扱えます
ファイルやディレクトリの存在チェックは、osモジュールを使用することで可能です


前回の確認問題の回答例

前回の記事はこちら→【Python連載】テキストファイルに書き込む
前回は、次のような問題でした。

sample.txtというテキストファイルが存在しない状況で、次のようなプログラムを実行しました。

file = open("sample.txt","w")
file.write("111")
file.close()

with open("sample.txt","a") as file:
file.write("\n222")

どのような結果が得られるでしょう。
正しい選択肢を次のうちから一つ選びなさい。
(1)sample.txtには『111』というテキストが書き込まれている。
(2)sample.txtには『222』というテキストが書き込まれている。
(3)sample.txtには『111(改行)222』というテキストが書き込まれている。
(4)sample.txtというファイルは生成されない

【解答】
1~3行目では、open関数、close関数を使用して、上書きモードでsample.txtというファイルを開こうとしています。
今回の条件では元々sample.txtというテキストファイルは存在していない状況なので、新規に作成されます。
この時点では、『111』と書かれたsample.txtが存在することになります。

次に、5,6行目では、with~as構文を使用して、追記モードでsample.txtというファイルを開こうとしています。
追記モードなので、sample.txtというファイルが存在する場合には、既存のテキストに追記する形で記載がされます。

よって、正解は選択肢(3)となります。