pythonではwith文と呼ばれる構文があります。with文を使うことでファイル等の操作がより簡単に行うことが可能です。
本記事ではwith文について具体例を使いながら、わかりやすく紹介します。
pythonのwith文とは?
with文はコンテキストマネージャによって定義されたコードを再利用しやすくする手法です。
ファイルを開く、ファイルを操作する、ファイルを閉じるという一連の流れをwith文で実行する、「with open」がよく知られています。
コンテキストマネージャとは
コンテキストマネージャとはwith文で起動できるオブジェクトです。
withの前後でどのよう処理を行うか指定することが可能です。
今回紹介するコードは全て、グーグルコラボラトリーでコーディングと動作確認をしています。
グーグルコラボラトリーでグーグルドライブの操作を行うためには、両者を接続する必要があります。
次のコードを実行することで接続が可能です。
from google.colab import drive, files
# mount Google Drive
drive.mount("/content/drive")
実行後に操作を指示されるので、その指示に従って接続してください。
with openでファイルの閉じ忘れを防止
ファイルを開くopen関数はclose関数でファイルを閉じないとファイルが開いたままになり、予期市内更新をしてしまう可能性があります。
with文を使用してopen関数を記述するとファイルを自動で閉じてくれるので、ファイルの閉じ忘れを防止することが可能です。
今回はGoogleドライブのマイドライブ上にhello.txtというテキストファイルを操作してみましょう。
事前にマイドライブにHello World!と書いた、hello.txtファイルを用意してください。
はじめにwith文を使わずにhello.txtの中身を確認します。
path = '/content/drive/MyDrive//hello.txt'
hello_file = open(path)
print(hello_file.read())
hello_file.close()
出力:
Hello World!
ファイルを開くopen()、ファイルの中身を確認するread()、ファイルを閉じるclose()の3つの関数を使いました。
続いて、with文でhello.txtの中身を こんにちは世界! に変更してみましょう。
with open(path, "w",encoding='utf-8') as file:
file.write("こんにちは世界!")
内容が変更されたかwith文で確認してみます。
with open(path,encoding='utf-8') as file:
print(file.read())
出力:
こんにちは世界!
with文でディレクトリ迷子を防ぐ
with open以外のwith文の使い方として、ディレクトリを移動して操作した後、元々居たディレクトリに戻ってくることもできます。
ディレクトリを何度も移動すると、自分が今いるディレクトリが分からなくなることがあります。
コンテキストマネージャで「ディレクトリを移動したら元のディレクトリに戻ってくる」というコードを作成することで、ディレクトリ迷子を防ぐことが可能です。
現在のディレクトリを確認してみましょう。
ディレクトリの移動や作成のような操作をする場合、python標準ライブラリのosモジュールを使用すると便利です。
import os
current = os.getcwd() #現在実行中のディレクトリ(カレントディレクトリ)を確認
print(current)
出力:
/content
初めはwith文を使わずに、マイドライブへ移動してみます。
mydrive = '/content/drive/MyDrive'
os.chdir(mydrive) #ディレクトリをマイドライブに移動
current = os.getcwd()
print(current)
出力:
/content/drive/MyDrive
マイドライブに移動できました。currentへは自動では戻りません。
それではディレクトリを移動した後、必ずマイドライブに戻ってくるコンテキストマネージャを作成します。
contextlibはwith文に関わるコンテキストを操作しやすくするための、python標準ライブラリに含まれているモジュールです。
@contextlib.contextmanagerはコンテキストマネージャを簡単に作成できるデコレータです。
import contextlib
import os
@contextlib.contextmanager
def chdir(path):
current = os.getcwd()
try:
os.chdir(path)
yield
finally:
os.chdir(current)
マイドライブのtestというフォルダへ移動し、testフォルダ内に新たにtest2というフォルダを作成するという操作を、with文で実行します。
事前にtestフォルダをマイドライブ内に作成しておいてください。
test = '/content/drive/MyDrive/test'
with chdir(test):
os.mkdir('/content/drive/MyDrive/test/test2')
print(current)
出力:
/content/drive/MyDrive
操作を実行後もマイドライブにいるようです。
Googleドライブを確認すると、test2のフォルダが作成されていることが確認できます。
このことから、testフォルダに移動してtest2フォルダを作成した後、マイドライブに戻ってきたことがわかります。
まとめ
今回はwith文について紹介しました。
with文を活用することで、「ファイルを開く→ファイルの閲覧・編集をする→ファイルを閉じる」というような一連の操作を漏れなく実行できます。
コメント