今さらPython3 (55) - pickle など

第8章は、結構ボリュームがある気がする。

入門 Python 3

入門 Python 3

設定ファイル?

configparserというのを使う方法がある。その前に、こんなテキストファイルを作ってみよう。

[english]
greeting = Hello

[french]
greeting = Bonjour

[german]
greeting = Gutentag

[files]
home = /usr/local
# Simple insertion
bin = %(home)s/bin

それのファイルを使って値を読み込む。

>>> import configparser
>>> cfg = configparser.ConfigParser()
>>> cfg.read('settings.cfg')
['settings.cfg']
>>> cfg
<configparser.ConfigParser object at 0x1007755f8>
>>> cfg['german']
<Section: german>
>>> cfg['german']['greeting']
'Gutentag'
>>> cfg['files']['bin']
'/usr/local/bin'
>>> 

もっと詳しい使い方は、これを見てねと。

14.2. configparser — Configuration file parser — Python 3.3.6 documentation

>>> cfg['german']['greeting'] = 'Hallo'
>>> cfg['german']['greeting'] 
'Hallo'
>>> with open('settings.cfg', 'wt') as cf:
...     cfg.write(cf)
... 
>>> 

とは言え、cfgファイルに書くところぐらいまではやっておこうよ。

XMLJSONより小さくて高速なバイナリデータ交換方式もあるらしい。とりあえず名前だけ。

MessagePack: It's like JSON. but fast and small.
google/protobuf · GitHub
Apache Avro™ 1.7.7 Documentation
Apache Thrift - Home

pickle

>>> import pickle
>>> import datetime
>>> now1 = datetime.datetime.utcnow()
>>> pickled = pickle.dumps(now1)
>>> now2 = pickle.loads(pickled)
>>> now1
datetime.datetime(2015, 12, 23, 8, 4, 15, 772061)
>>> now2
datetime.datetime(2015, 12, 23, 8, 4, 15, 772061)
>>> 

漬け物にする(pickle)から圧縮というイメージがつきまとうけど、now1というのをシリアライズ(直列化と言われてもねぇ)して、それを復元してnow2に戻して、はい、now1とnow2は同じでしょという事ですね。

>>> class Tiny():
...     def __str__(self):
...         return 'tiny'
... 
>>> obj1 = Tiny()
>>> obj1
<__main__.Tiny object at 0x1019d9e80>
>>> str(obj1)
'tiny'
>>>
>>> pickled = pickle.dumps(obj1)
>>> pickled
b'\x80\x03c__main__\nTiny\nq\x00)\x81q\x01.'
>>> obj2 = pickle.loads(pickled)
>>> obj2
<__main__.Tiny object at 0x101b83e80>
>>> str(obj2)
'tiny'
>>>  

dump()からloads()をしているので復元できてますってところか。ちなみに、シリアライズの反対をデシリアライズと呼ぶらしい。デシリアライズして変なモノが動くと困るので、信用できないオブジェクトについては触るべからずと。

構造化されたバイナリファイル

Excelファイルからデータを抜き出すxlrdというツールがあるらしい。

pypi.python.org
The xlrd Module

Excel側でCSVとして吐き出せば良いのかなと思いつつ、Excelのものすごい古いバージョンとか、壊れてexcelで開けなくなったファイルとかからデータを吸い出すような使い道はあるかもと思ったり。

www.hdfgroup.org

HDF5というのは、大規模のデータセットへの高速なランダムアクセスに優位らしいけど、今のところ使い道がイメージ付かない。Appendix Cで取り上げられているらしいので、時間があれば立ち寄る感じかな。

(つづく)