1. TOP
  2. プログラム
  3. ソフト
  4. python
  5. その他のデータ交換形式

その他のデータ交換形式

JSON

JavaScriptの枠を越えて非常に広く使われてるいる、データ交換形式になっている
JSON形式はJavaScriptのサブセットであり、Pythonで用いられることも多い
プログラムの間でデータを交換する方法としての優れています。
JSONモジュールはjsonと言う名前を持つものが一つだけです。Pythonデータを
JSON文字列にエンコード(ダンプ)したり、JSON文字列をPYthonデータにデコード
(ロード)したりする。まずは、先ほどのXMLのサンプルのデータを格納する
Pythonデータ構造を作ろう
menu = \
{
"breakfast":{
"hourse":"7-11",
"items": {
"breakfast burritos": "$6.00"
"pancakes": "$4.00"
}
},
"lunch": {
"hours": "11-3",
"items": {
"hamburger": "$5.00"
}
},
"dinner": {
"hours": "3-10",
"items": {
"spaghetti": "$8.00"
}
}
}

次に、dumps()を使ってこのデータ構造をJSON文字列にエンコードする
import json
menu_json = json.dumps(menu)
menu_jason

そして、loads()を使って、JSON文字列のmenu_jsonをPythonデータ構造(menu2)に
戻そう
menu2 = json.Ioads(menu_json)
menu2
menuとmenu2は、ともに同じキーと値を持つ辞書だ、そして辞書の常として、
すべてのキーを取りだしたときのキーの順序はまちまち

JSON標準が日付、時刻型を定義していないからである。処理方法は自分で定義してくれ
なので。datetimeを文字列やUnix時間などのJSONが理解できるものに変換すればいい
now_str = str(now)
json.dumps(now_str)
'*2013-02-22 03:49:27.483336*'

from time import mktime
now_epoch = int(mktime(now.timetuple()))
json.dums(now_epoch)
'1361526567'

JSONのエンコードの方法は、継承によって変更できる。
複素数を対象とした例が参考になるので、datetime用に書き換えよう
class DTEncoder(json.JSONEncoder):
def default(self, obj):
# isinstance()はobjの型をチェックする
if isinstance(obj, datetime.datetime):
return int(mktime(obj.timetuple()))
# でなければ、通常のデコーダの処理を使う
return json.JSONEncoder.dfault(self, obj)

新しいETEncoderは、JSONEncoderのサブクラス、子クラスである
dateime処理は、default()メソッドをオーバーライトするだけで追加できる。
継承のおかげで、ほかのすべての処理は親クラスで実行される。

YAML

JSONと同じ様にキーと値を持ちますが、日付と時間をはじめとして、
JSONよりも多くのデータ型を処理する。pythonの標準ライブラリはまだ
YAML処理を取り込んでいない。サードパーティライブラリーの
PyYAMLをインストールする
load()がYMAL文字をPythonデータに変換し、dump()が逆の変換を行う
信頼できないYAMLをインポートする場合は、load()ではなくsafe_load()を
使う。むしろ必ず、safe_load()を使う

pickleによるシリアライズ

ファイルにデータ構造を保存すことをシリアライズ(直列化)と言う

JSONなどの形式は、Pythonプログラムのすべてのデータ型をシリアライズ

するためには、カスタムの変換器が必要になる。Pythonは、特別なバイナリ形式で、あらゆる
オブジェクトを保存、復元できるpickleモジュールを提供している。
import pickle
import datetime
now1 = daatetime.datetime.utcnow()
pickled = pickle.dumps(now1)
now2 = pickle.loads(pickled)

pickleはプログラム内で定義された独自クラスやオブジェクトも処理できる
文字列として扱ったときに、'tiny'と言う文字列を返すTinyという小さなクラス
を定義する
import pickle
class Tiny():
def __str__(self)
return 'tiny'
obj1 = Tiny()
obj1
<__main__.Tiny object at 0x10076ed10>
str(obj1)
'tiny'

pickled = pickle.dumps(ob1)
obj2 = pickle.loads(pickled)
obj2
<__main__.Tiny object at 0x10076ed11>
str(obj2)
'tiny'
pickledは、obj1オブジェクトからpickleでシリアライズしたバイナリシーケンス
です。これをさらにobj2オブジェクトに変換し戻して、obj1のコピーを作っている

pickleはPysonオブジェクトを作ることができるので、セクリティ上の注意が必要