読み取り専用の open() コンテキストマネジャー
数か月かけて収集・クレンジングした次回の deep learning プロジェクト用のデータファイルがたくさんあります。学習用に読み込む際、誤って上書きしてしまったら大変です。そこで、プロジェクトで使うために open() の読み取り専用バージョンのコンテキストマネジャーを作成することにしました。
通常の open() コンテキストマネジャーは次のことを行います。
- ファイル名とモード(読み取りは
'r'、書き込みは'w'、追記は'a')を受け取る - 読み取り/書き込み/追記のためにファイルを開く
- ファイルへの参照とともに制御をコンテキストに返す
- コンテキストの処理が終わるまで待機する
- その後、終了前にファイルを閉じる
今回のコンテキストマネジャーも基本は同じですが、引数として受け取るのはファイル名のみで、ファイルは読み取り専用で開く点が異なります。
この演習はコースの一部です
Python関数の書き方
演習の手順
open_read_only()からコンテキストブロックへ制御を渡し、read_only_fileオブジェクトがmy_fileに代入されるようにしてください。- 開きっぱなしのファイルを残さないように、
read_only_fileの.close()メソッドを使用してください。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
@contextlib.contextmanager
def open_read_only(filename):
"""Open a file in read-only mode.
Args:
filename (str): The location of the file to read
Yields:
file object
"""
read_only_file = open(filename, mode='r')
# Yield read_only_file so it can be assigned to my_file
____ ____
# Close read_only_file
____.____()
with open_read_only('my_file.txt') as my_file:
print(my_file.read())