Python的漬け物・・・?pickleで散々

8月 7th, 2016

#####
後で見直して、pickleを使うには、初めにインポートが必要なことを書き落としていました。コードを指定した後にでも「import pickle」を入れておいて下さい。
#####

ユーザーの名前と日付と数字と・・・と一緒に保存しようとしたら「データの型が違うやんけ!!」とpythonに叱られた。いや、別に関西弁で言われたわけではないが。コンピュータは、データの型にうるさい。数字と文字は別だし、日付は日付タイプで別の型らしい。

一緒に保存できないのか、といえばそうではなく、いろいろな型をそのまま保存できるpickleというものがある。複数形の「s」をつけるとピクルス。漬け物になる。

というわけで、pickleでデータをつけ込めば、日付型だろうが文字だろうが数字だろうが一緒に保存できる。

・・・ただね、ネットのあちこちで「便利!」「簡単!」と書いてある割に、使い方がいまいち良く分からない。

確かにある意味簡単なんだが、実用レベルに持って行くには、初心者にはかーなーり、ハードルが高い。

一応保存と復元をやってみた。

保存したいデータ:
name=’ななしさん’
day=datetime.datetime.today()
4

例えばこの三つ。nameの中身は文字列、dayの中身はdatetime型、4は数字

f = open(‘pickletest’, ‘wb’)
pickle.dump([name, day, 4], f)
f.close()

これで、pickletestというファイルにタイプばらばらのデータをそのまま保存できる。

python3を使っているので、ファイルはテキストではなくバイナリ。なので、書き込みモードは「w」ではなく「wb」。python2.x系統だとテキストで行けるような話を見たような気がする(バージョン違いは良く分からない)。エディタなどでできたファイルを開くと、pickletestの中身はぐちゃぐちゃに見える(バイナリなので)。2.x系統だと結構きれいに見えるっぽい。

復元も簡単。

f=open(‘pickletest’,'rb’)
obj=pickle.load(f)
f.close()

これでファイルから読み込んでデータがobjに入る。obj[0]には「ななしさん」が入っているし、obj[1]には日時データが入っている。

ここまではそう難しくない。ただね、名前が「ひみつ」さんのデータも別の日時データと共に入れたいな、と思うとだ・・・話がややっこしい。追加書き込みでやってみた。名前ひみつさんのデータは、namex=’ひみつ’、日時はdayxで新たに取り直し。

f=open(‘pickletest’,'ab’)
pickle.dump([namex, dayx, 5], f)
f.close

これを読み込んでみたら、はじめの「ななしさん」のデータしか取れなかった。pickletestの中を見ると、データは増えていて、ひみつさんのデータも書き込んではあるっぽい。

というわけで、ひょっとしたら順番に読み込めば取り出せるんじゃないか、と地道にやってみた。

f=open(‘pickletest.txt’,'rb’)
subj=pickle.load(f)
subb=pickle.load(f)
f.close()

sujにはななしさんのデータが入り、subbにはひみつさんのデータが無事入った。

でもなあ・・・こんなプログラミングってありなのか?いや、動いているけど。

10人分とかのデータを扱おうと思ったら厄介なことに。やってやれなくはなさそうだけど、絶対何かが違うと思うんだ。

まあね、初めにだーっとまとめておいて一気にpickleにして保存すればいいんだけど、それだと「名前データ一覧が欲しい」という時にやりにくい気がするんだよね・・・やり方を思いつかないわけではないけどさ・・・◯個おきのインデックスで取り出せばいいもんね。法則性がある場合に限るが。

絶対、絶対、どこかにスマートなやり方があるはずだ。

・・・と思いつつ、結局漬け物はあきらめたのだった。仕方がないので、当面、全部文字列に変換して保存することにした。pythonの漬け物は甘くなかった・・・

関連記事

  1. 日差と秒差はあるのに分差がない不思議
  2. 正規表現とどっちが早い?
  3. 時刻の差分を計算したい
  4. ファイルの読み込みをちょこっと実験
  5. pygameでmp3を再生
  6. pickleで怪事件
  7. 再生チェックをしても止まらなかった原因が分かった

Comments are closed.