変数をまとめてラクに保存したいなーって思ったのでそういうプログラムを作りました。
2次元配列も応用すれば保存できます。
…書いてから気づいたけど追記のやり方の方が良さそうかも
忙しい方は追記へジャンプ
単純に全変数を保存したい場合はdillを用いたやり方で
追記の方法だと、型の関係か使おうとしたデータではエラーになりました。
DataFrameを使う方法だとエラーにならなかったので、
一度DataFrameを挟むのも無意味ではないのかも。
import pandas as pd
まずpandasをimportします
# --- テスト用に変数を定義 ---
a ,b,c,d = 1,2,3,4
xx = [3,6,8]
yy = [5,8,2]
zz = [8,2,8]
この関数、配列を保存します
# --- 変数をまとめてdataframeにしてcsv保存 ---
def getName(obj):
return [k for k, v in globals().items() if id(obj) == id(v)][0] # 変数名をstrでreturn
この関数を使うことで変数名をstrとして取得します
ほぼこちらの記事のコピペです
内容はこちらを参照ください
df = pd.DataFrame()
datas1 = [xx,yy,zz] # 変数名をヘッダーにしながら、1次元配列をまとめてdataframe化
for data in datas1:
df = pd.concat([df, pd.DataFrame({getName(data):data})],axis=1) # {}集合を使ってdataframeをconcatで追加
{名前:値}
を元にDataFrameを作成してconcatでdf
にどんどん追加保存していきます
axis = 1を入れることで横に追加となります
datas2 = [a,b,c,d]# 変数名をヘッダーにしながら、変数をまとめてdataframe化
for data in datas2:
df = pd.concat([df, pd.DataFrame({getName(data):[data]})],axis=1)# {}集合を使ってdataframeをconcatで追加
先ほどと同様の事を行います
{名前:値}
の値
は配列である必要があるので値
を[data]
としています
df.to_csv('test.csv')
print(df)
del df
保存して表示します。
df
はいろいろなとこで使いがちなので削除も一応しておきます。
以下の表にちゃんと表示、保存出来ていることが分かります
xx yy zz a b c d
0 3 5 8 1.0 2.0 3.0 4.0
1 6 8 2 NaN NaN NaN NaN
2 8 2 8 NaN NaN NaN NaN
ソースコード
import pandas as pd
# --- テスト用に変数を定義 ---
a ,b,c,d = 1,2,3,4
xx = [3,6,8]
yy = [5,8,2]
zz = [8,2,8]
# --- 変数をまとめてdataframeにしてcsv保存 ---
def getName(obj):
return [k for k, v in globals().items() if id(obj) == id(v)][0] # 変数名をstrでreturn
df = pd.DataFrame()
datas1 = [xx,yy,zz] # 変数名をヘッダーにしながら、1次元配列をまとめてdataframe化
for data in datas1:
df = pd.concat([df, pd.DataFrame({getName(data):data})],axis=1) # {}集合を使ってdataframeをconcatで追加
datas2 = [a,b,c,d]# 変数名をヘッダーにしながら、変数をまとめてdataframe化
for data in datas2:
df = pd.concat([df, pd.DataFrame({getName(data):[data]})],axis=1)# {}集合を使ってdataframeをconcatで追加
df.to_csv('test.csv')
print(df)
del df
追記
直接csvに書き込む
# --- テスト用に変数を定義 ---
a ,b,c,d = 1,2,3,4
xx = [3,6,8]
yy = [5,8,2]
zz = [8,2,8]
import csv
# --- 変数を選んでcsv保存 ---
def getName(obj):
return [k for k, v in globals().items() if id(obj) == id(v)][0] # 変数名をstrでreturn
with open('test2.csv','a', newline="") as f:
datas = [xx,yy,zz,]
writer = csv.writer(f)
for data in datas:
writer.writerow([getName(data)]+data)
datas = [a,b,c,d]
for data in datas:
writer.writerow([getName(data)]+[data])
場合分けは単一の変数をlist型に変換するため
出力 test2.csv
xx,3,6,8
yy,5,8,2
zz,8,2,8
a,1
b,2
c,3
d,4
dillを用いたやり方
保存
import dill
dill.dump_session('session.pkl')
読み込み
import dill
dill.load_session('session.pkl')
ですべての変数がそのまま使えます。