Pythonのプログラマーは、配列、リスト、辞書を直列化したデータ構造として多用しています。これらのデータ構造を永続的に保存するには、ファイルかデータベースのどちらかを使用する必要があります。この記事では、リストをファイルに書き込む方法と、そのリストをメモリに読み込む方法を説明します。
Pythonでは、ファイルにデータを書き込んだり、ファイルからデータを読み出したりするために、1行を扱う標準的なメソッド write()
と read()
に加え、複数行を扱うメソッド writelines()
と readlines()
を提供しています。さらに、 pickle
と json
モジュールは、シリアライズされたデータセットを扱うための賢い方法を提供します。
読み出しと書き込みのメソッドを使用する
文字(ストリング)を扱うには,基本的なメソッドが非常に有効です.このようなリストを一行ずつファイル listfile.txt
に保存するには,以下のようにすればよい.
# define list of places
places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']
with open('listfile.txt', 'w') as filehandle:
for listitem in places:
filehandle.write('%s
' % listitem)
6行目では、まずlistitem
が改行され、次に出力ファイルに保存される。ファイル listfile.txt からリスト全体を読み込んでメモリに戻すには、次の Python コードがその方法を示します。
# define an empty list
places = []
# open file and read the content in a list
with open('listfile.txt', 'r') as filehandle:
for line in filehandle:
# remove linebreak which is the last character of the string
currentPlace = line[:-1]
# add item to the list
places.append(currentPlace)
文字列の末尾の改行を削除する必要があることに注意してください。この場合、Pythonは文字列のリスト操作も可能であることが役に立ちます。上記のコードの8行目では、この削除は単純に文字列自体に対するリスト操作として行われ、最後の要素以外はすべて保持されます。この要素には、UNIX/Linuxシステムでの改行を表す文字「˶‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾」が含まれています。
writelinesとreadlinesメソッドを使用する
冒頭で述べたように、Pythonには複数の行を一度に書き込んだり読み込んだりするための writelines()
と readlines()
という二つのメソッドも用意されています。リスト全体をディスク上のファイルに書き込むためのPythonのコードは以下の通りです。
# define list of places
places_list = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']
with open('listfile.txt', 'w') as filehandle:
filehandle.writelines("%s
" % place for place in places_list)
ディスク上のファイルからリスト全体を読み出すには、Pythonのコードは以下のようになります。
# define empty list
places = []
# open file and read the content in a list
with open('listfile.txt', 'r') as filehandle:
filecontents = filehandle.readlines()
for line in filecontents:
# remove linebreak which is the last character of the string
current_place = line[:-1]
# add item to the list
places.append(current_place)
上のリストは、他のプログラミング言語から借用した、より伝統的なアプローチに従っています。よりPythonらしい書き方をするには、以下のコードを見てください。
# define empty list
places = []
# open file and read the content in a list
with open('listfile.txt', 'r') as filehandle:
places = [current_place.rstrip() for current_place in filehandle.readlines()]
5行目で listfile.txt
というファイルを開いてから、リストの再構築は6行目で行われます。まず、ファイルの内容が readlines()
によって読み込まれます。次に、for
ループで各行から rstrip()
メソッドを使って改行文字を削除します。3番目に、その文字列が新しいリストアイテムとして場所のリストに追加されます。前のリストと比べると、コードはずっとコンパクトですが、初心者のPythonプログラマーには読みにくいかもしれません。
Pickleモジュールの使用
ここまで説明した様々な方法は、人間が読めるようにリストを保存するものです。もし、この方法が必要でない場合は、pickleモジュールが非常に便利です。その dump()
メソッドはリストをバイナリデータとして効率的に保存します。まず、7行目(以下のコード)で、出力ファイル listfile.data
がバイナリ書き込み(”wb”)用にオープンされます。次に、9行目
で、dump()
メソッドを用いてリストをオープンしたファイルに格納する。
# load additional module
import pickle
# define a list of places
placesList = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']
with open('listfile.data', 'wb') as filehandle:
# store the data as binary data stream
pickle.dump(placesList, filehandle)
次のステップとして、以下のようにしてファイルからリストを読み込みます。まず、4行目で出力ファイル listfile.data
を読み込み用にバイナリオープンする (“rb”)。次に、load()
メソッドを用いてファイルから場所のリストを読み込む。
# load additional module
import pickle
with open('listfile.data', 'rb') as filehandle:
# read the data as binary data stream
placesList = pickle.load(filehandle)
この2つの例は、文字列の使い方を示しています。しかし、pickle
は文字列、数値、自己定義構造体、その他Pythonが提供するあらゆる組み込みデータ構造のような、あらゆる種類のPythonオブジェクトを扱うことができます。
JSON形式の使用
バイナリデータ形式である pickle
は Python 固有のものです。異なるプログラム間の相互運用性を高めるために、JavaScript Object Notation (JSON) は使いやすく、人間が読みやすいスキーマを提供し、その結果、非常に人気が出てきました。
次の例は、jsonモジュールを使って、変数の種類が混在するリストを出力ファイルに書き出す方法を示しています。4行目で基本的なリストが定義されています。7行目で出力ファイルを書き込み用にオープンし、dump()
メソッドはJSON記法を用いて基本リストをファイルに格納します。
import json
# define list with values
basicList = [1, "Cape Town", 4.6]
# open output file for writing
with open('listfile.txt', 'w') as filehandle:
json.dump(basicList, filehandle)
出力ファイルの内容をメモリに読み込むのは、データを書き込むのと同じくらい簡単です。dump()に対応するメソッドは
load()` であり、以下のように動作する。
import json
# open output file for reading
with open('listfile.txt', 'r') as filehandle:
basicList = json.load(filehandle)
結論
以上、単純なデータの読み書きから、pickleやJSONを使ったバイナリストリームによるデータのダンプ・ロードまで、さまざまな方法を紹介しました。これにより、リストを永続的に保存し、それをメモリに読み込むことが容易になります。
謝辞
Zoleka Hatitongweのサポートに感謝する。