pickleによるファイル入出力

目的

あるプログラムの処理結果をファイルに保存し,別のプログラムでファイルに保存されたデータを読み込んで続きの処理をすることがある.Pythonではデータをファイルに入出力する方法として,pickleモジュールを使用した方法がある.ここではpickleモジュールを用いたファイル入出力について学ぶ.

説明

整数値のファイル入出力

ファイルへの出力

まず整数値をファイルに保存してみよう.例えば年齢を表す整数値20を「age.pickle」という名前のファイルに保存するには,以下のように記述すればよい.

1行目でpickleモジュールをインポートし,5,6行目で保存する整数値と作成するファイル名に名前をつけている.8行目で,ファイル「age.pickle」をモード「wb」でオープンし,ファイルを表すオブジェクトに「f」という名前をつけている.「wb」は書き込み(write)モードとバイナリ(binary)モードを表している.今回は,バイナリデータを書き込むファイルをオープンするので,モードとして「wb」を指定している.9行目のように,pickleモジュールのdump関数を呼び出すと,ageに保存されているデータをfが表すファイルに保存することができる.10行目でオープンしたファイルをクローズしている.実行すると,新しく「age.pickle」というファイルができるはずである.(既にある場合は上書きされる.)

ファイルからの入力

次に,ファイルに保存されている年齢を表す整数値を読み込み,表示してみよう.

7行目でファイル「age.pickle」をモード「rb」でオープンし,ファイルを表すオブジェクトに「f」という名前をつけている.「rb」は読み込み(read)もモードとバイナリ(binary)モードを表している.今回はバイナリデータを読み込むファイルをオープンするので,モードとして「rb」を指定している.8行目のように,pickleモジュールのload関数を呼び出すと,fが表すファイルからデータを読み込み,変数ageに代入することができる.9行目でファイルをクローズし,11行目で読み込んだデータを表示している.実行すると,以下のように年齢を表す整数値20が表示されるはずである.

with構文を用いたファイルのオープン

整数値をファイルに書き出すコードとファイルから読み込むコードはwith構文を使用して以下のように書くことができる.

先程の例と比較すると,大きな違いはファイルをクローズする部分を書いているかどうかである.with構文を用いずにファイルをオープンすると,必ずクローズする必要があるが,クローズする部分を書き忘れることがある.with構文を使用すると,with構文中のインデントが下がっている部分の処理が終わると,自動的にファイルがクローズされる.そのため,ファイル入出力をする際にはwith構文を使用することが多い.

浮動小数点数のファイル入出力

浮動小数点数も整数と同様にファイルに保存できる.例えば身長を表す浮動小数点数をファイル「height.pickle」に書き込むには,以下のように記述すればよい.

実行すると,新たに「height.pickle」という名前のファイルができる.

ファイルから身長を表す浮動小数点数を読み込み,表示するには,以下のように記述すれば良い.

実行すると,身長の値が表示されるはずである.

文字列のファイル入出力

文字列データも数値データと同様にファイルに保存できる.例えば自己紹介文を表す文字列データをファイル「introduction.pickle」に書き込むには,以下のように記述すればよい.

実行すると,新たに「introduction.pickle」という名前のファイルができる.

ファイルから文字列データを読み込み,表示するには,以下のように記述すれば良い.

実行すると,自己紹介文を表す文字列データが表示されるはずである.

リストのファイル入出力

リストのデータも同様にファイルに保存できる.例えば,名前・年齢・趣味・血液型からなるリストをファイル「introduction_list.pickle」に書き込むには,以下のように記述すればよい.

実行すると,新たに「introduction_list.pickle」という名前のファイルができる.

ファイルからリストのデータを読み込み,表示するには,以下のように記述すればよい.

実行すると,保存したリストのデータが表示されるはずである.

辞書のファイル入出力

辞書のデータも同様にファイルに保存できる.例えば,名前・年齢・趣味・血液型からなる辞書をファイル「introduction_dictionary.pickle」に書き込むには,以下のように記述すればよい.

実行すると,新たに「introduction_dictionary.pickle」という名前のファイルができる.

ファイルから辞書のデータを読み込み,表示するには,以下のように記述すればよい.

実行すると,保存した辞書のデータが表示されるはずである.

画像のファイル入出力

画像データも同様にファイルに保存できる.(通常はjpgやpngといった汎用的なファイルフォーマットで保存するが,今回はpickle形式で保存することにする.)例えば,「input_image.png」という名前の画像を読み込み,その画像データをファイル「image.pickle」に書き込むには,以下のように記述すればよい.

実行すると,新たに「image.pickle」という名前のファイルができる.

ファイルから画像データを読み込み,ウィンドウに表示するには,以下のように記述すればよい.

cloudpickleモジュール

このように,pickleモジュールを使用すれば,Pythonで扱うほとんどのオブジェクトをファイルに保存し,ファイルから読み込むことができる.ただし,pickleモジュールでは,一部の機能を実装したクラスのオブジェクトをファイルに保存することができない.

そこで,pickleモジュールと同じように使用できるcloudpickleモジュールがある.cloudpickleモジュールを使用して,画像データをファイルに書き出し,ファイルから読み込むには,以下のように記述すればよい.

使い方はpickleモジュールとほとんど同じである.pickleモジュールで保存できないオブジェクトを保存する場合にはcloudpickleモジュールを使用すればよい.

テキストファイルへの入出力

テキストファイルへの出力

ここまでは,様々なデータをバイナリファイルとして書き出し,読み込む方法を説明した.ここでは,文字列データをテキストファイルとして書き出し,読み込む方法を説明する.例えば,自己紹介文をテキストファイルに書き出すには,以下のように記述すればよい.

5行目のように,ファイルをモード「w」でオープンすると,テキストデータを書き出すモードでファイルをオープンできる.6行目のように,writeメソッドによりテキストデータをファイルに書き出すことができる.

実行すると,「introduction.txt」という名前のファイルができ,以下の内容が保存される.

テキストファイルからの入力

書き出したテキストファイルを読み込んで表示するには,例えば以下のように記述すればよい.

4行目のように,ファイルをモード「r」でオープンすると,テキストデータを読み込むモードでファイルをオープンできる.5行目のように,readメソッドによりファイルからテキストデータを読み込むことができる.実行すると,テキストファイルの内容が表示される.

また,以下のように,readlinesメソッドを使用すると,テキストファイルの内容を1行ずつ分割した文字列からなるリストとして読み込むことができる.

実行すると,以下のように表示され,テキストファイルの内容がリストとして読み込めていることがわかる.

課題

課題0

英語の試験の点数をファイルに書き出し,ファイルから読み込んで表示せよ.

課題1

自分の名前をバイナリデータとしてファイルに書き出し,ファイルから読み込んで表示せよ.

課題2

英語・数学・国語・理科・社会のテストの点数からなるリストをファイルに書き出し,ファイルから読み込んで表示せよ.

課題3

英語・数学・国語・理科・社会のテストの点数からなる辞書をファイルに書き出し,ファイルから読み込んで表示せよ.

課題4

血液型の集合をファイルに書き出し,ファイルから読み込んで表示せよ.

課題5

身長と体重からBMIと標準体重を求め,BMIと標準体重のリストをファイルに書き出し,ファイルから読み込んで表示せよ.

課題6

読み込んだ画像の画像データをファイルに書き出し,ファイルから読み込んでウィンドウに表示せよ.

課題7

読み込んだ画像をグレースケール画像に変更し,グレースケールに変換した画像データをファイルに書き出し,ファイルから読み込んでウィンドウに表示せよ.

課題8

読み込んだ画像の解像度を変更し,元の画像データと解像度を変更した画像データをリストとしてファイルに書き出し,ファイルから読み込んでウィンドウに表示せよ.

課題9

自己紹介文をテキストデータとしてファイルに書き出し,ファイルから読み込んで表示せよ.