🍎

【Python】インスタンス変数をタプル形式でテキストファイルに保存する方法と、読み込む方法

2023/01/06に公開

インスタンスをリストで保持しているときに、それぞれのインスタンス変数をテキストファイルに保存する方法と、保存したテキストファイルからインスタンスを復元する方法のご紹介です。

インスタンス変数をテキストファイルに保存する方法

以下のようにProfileクラスがあってそのインスタンスをリストで保存している場合

# Profileクラス
class Profile:
  def __init__(self, name, age, email):
    self.name  = name
    self.age   = age
    self.email = email
# Profileクラスを格納するリスト
profileList = []
# リストにProfileインスタンスを追加
profileList.append(Profile("山田",38,"yamada@yamada.ya"))
profileList.append(Profile("田中",35,"tanaka@tanaka.ta"))
profileList.append(Profile("松本",46,"matsumoto@matsu.ma"))

中身を以下のように見てみます。

print(vars(profileList[0]))
print(vars(profileList[1]))
print(vars(profileList[2]))

出力結果

{'name': '山田', 'age': 38, 'email': 'yamada@yamada.ya'}
{'name': '田中', 'age': 35, 'email': 'tanaka@tanaka.ta'}
{'name': '松本', 'age': 46, 'email': 'matsumoto@matsu.ma'}

これをテキストファイルに保存したい場合、以下のようにします。

  1. varsでdict(辞書)化
  2. item()でdict_items(リストやタプルに変換できる形式)化
  3. listでリスト化
  4. 中身を*でアンパックして出力
# Profileリストをテキストファイルに書き出す
with open("profile.txt", "w", encoding="utf-8") as o:
  # リストを1つずつ見ていく
  for profile in profileList:
    print(*list(vars(profile).items()), sep=",", file=o) 

出力結果

# profile.txtの中身
('name', '山田'),('age', 38),('email', 'yamada@yamada.ya')
('name', '田中'),('age', 35),('email', 'tanaka@tanaka.ta')
('name', '松本'),('age', 46),('email', 'matsumoto@matsu.ma')

テキストファイルを読み込み、インスタンスを復元する方法

作成したテキストファイルからインスタンス変数を読み込んでインスタンスを再びリスト化する方法は以下の通りです。
eval関数は、第1引数を式として評価するのでこれを使うとスムーズにいきました。

# Profileクラスを格納するリスト
profileList = []
# テキストファイルを開く
with open("profile.txt", "r", encoding="utf-8") as f:
  # 1行ずつ見ていく
  for line in f:
    # 改行コード削除
    line = line.rstrip()
    print(type(line), line)
    # タプルに変換
    reval = eval(line)
    print(type(reval), reval)
    # 辞書に変換
    rdict = {attr:val for (attr,val) in reval}
    print(type(rdict), rdict)
    # リストにProfileインスタンスを追加
    profileList.append(Profile(rdict['name'],rdict['age'],rdict['email']))

以下のように出力してみると

print(vars(profileList[0]))
print(vars(profileList[1]))
print(vars(profileList[2]))

出力結果

{'name': '山田', 'age': 38, 'email': 'yamada@yamada.ya'}
{'name': '田中', 'age': 35, 'email': 'tanaka@tanaka.ta'}
{'name': '松本', 'age': 46, 'email': 'matsumoto@matsu.ma'}

元通り戻すことができました。

他にも方法がございましたら、教えていただければ幸いです。
ありがとうございました。

Discussion