私は.csvファイルを使用してPythonにデータを出し入れすることに慣れていますが、これには明らかな課題があります。辞書(または辞書のセット)をjsonまたはpckファイルに保存する簡単な方法に関するアドバイスはありますか?例えば:
data = {}
data ['key1'] = "keyinfo"
data ['key2'] = "keyinfo2"
これを保存する方法と、再び読み込む方法の両方を知りたいです。
ピクルス save:
try:
import cPickle as pickle
except ImportError: # python 3.x
import pickle
with open('data.p', 'wb') as fp:
pickle.dump(data, fp, protocol=pickle.HIGHEST_PROTOCOL)
protocol
引数に関する追加情報については、 pickleモジュールのドキュメント を参照してください。
ピクルス load:
with open('data.p', 'rb') as fp:
data = pickle.load(fp)
JSON save:
import json
with open('data.json', 'w') as fp:
json.dump(data, fp)
きれいな結果を得るには、sort_keys
やindent
などの追加の引数を指定します。引数sort_keysはキーをアルファベット順にソートし、indentはデータ構造をindent=N
スペースでインデントします。
json.dump(data, fp, sort_keys=True, indent=4)
JSON load:
with open('data.json', 'r') as fp:
data = json.load(fp)
最小限の例、ファイルに直接書き込む:
import json
json.dump(data, open(filename, 'wb'))
data = json.load(open(filename))
または安全に開閉:
import json
with open(filename, 'wb') as outfile:
json.dump(data, outfile)
with open(filename) as infile:
data = json.load(infile)
ファイルではなく文字列で保存する場合:
import json
json_str = json.dumps(data)
data = json.loads(json_str)
高速化されたパッケージujsonも参照してください。 https://pypi.python.org/pypi/ujson
import ujson
with open('data.json', 'wb') as fp:
ujson.dump(data, fp)
シリアライズ後に、他のプログラムでデータを必要としない場合は、shelve
モジュールを強くお勧めします。永続的な辞書と考えてください。
myData = shelve.open('/path/to/file')
# check for values.
keyVar in myData
# set values
myData[anotherKey] = someValue
# save the data for future use.
myData.close()
ファイルに書き込むには:
import json
myfile.write(json.dumps(mydict))
ファイルから読み取るには:
import json
mydict = json.loads(myfile.read())
myfile
は、dictを保存したファイルのファイルオブジェクトです。
pickle
またはjson
の代替が必要な場合は、klepto
を使用できます。
>>> init = {'y': 2, 'x': 1, 'z': 3}
>>> import klepto
>>> cache = klepto.archives.file_archive('memo', init, serialized=False)
>>> cache
{'y': 2, 'x': 1, 'z': 3}
>>>
>>> # dump dictionary to the file 'memo.py'
>>> cache.dump()
>>>
>>> # import from 'memo.py'
>>> from memo import memo
>>> print memo
{'y': 2, 'x': 1, 'z': 3}
klepto
を使用して、serialized=True
を使用した場合、辞書は平文ではなくピクルス辞書としてmemo.pkl
に書き込まれます。
ここでklepto
を取得できます: https://github.com/uqfoundation/klepto
dill
は、pickle
自体よりも、おそらくpickleの選択に適しています。なぜなら、dill
は、Pythonでほとんどすべてをシリアル化できるからです。 klepto
もdill
を使用できます。
ここでdill
を取得できます: https://github.com/uqfoundation/dill
最初の数行の追加のmumbo-jumboは、klepto
が辞書をファイル、ディレクトリコンテキスト、またはSQLデータベースに格納するように構成できるためです。 APIは、バックエンドアーカイブとして選択したものと同じです。これは、アーカイブと対話するためにload
およびdump
を使用できる「アーカイブ可能な」辞書を提供します。
これは古いトピックですが、完全を期すために、それぞれPython 2および3の標準ライブラリの一部であるConfigParserとconfigparserを含める必要があります。このモジュールはconfig/iniファイルを読み書きし、(少なくともPython 3で)辞書のような多くの方法で動作します。さらに、複数の辞書をconfig/iniファイルの別々のセクションに保存して呼び出すことができるという利点もあります。甘い!
Python 2.7.xの例。
import ConfigParser
config = ConfigParser.ConfigParser()
dict1 = {'key1':'keyinfo', 'key2':'keyinfo2'}
dict2 = {'k1':'hot', 'k2':'cross', 'k3':'buns'}
dict3 = {'x':1, 'y':2, 'z':3}
# make each dictionary a separate section in config
config.add_section('dict1')
for key in dict1.keys():
config.set('dict1', key, dict1[key])
config.add_section('dict2')
for key in dict2.keys():
config.set('dict2', key, dict2[key])
config.add_section('dict3')
for key in dict3.keys():
config.set('dict3', key, dict3[key])
# save config to file
f = open('config.ini', 'w')
config.write(f)
f.close()
# read config from file
config2 = ConfigParser.ConfigParser()
config2.read('config.ini')
dictA = {}
for item in config2.items('dict1'):
dictA[item[0]] = item[1]
dictB = {}
for item in config2.items('dict2'):
dictB[item[0]] = item[1]
dictC = {}
for item in config2.items('dict3'):
dictC[item[0]] = item[1]
print(dictA)
print(dictB)
print(dictC)
Python 3.Xの例。
import configparser
config = configparser.ConfigParser()
dict1 = {'key1':'keyinfo', 'key2':'keyinfo2'}
dict2 = {'k1':'hot', 'k2':'cross', 'k3':'buns'}
dict3 = {'x':1, 'y':2, 'z':3}
# make each dictionary a separate section in config
config['dict1'] = dict1
config['dict2'] = dict2
config['dict3'] = dict3
# save config to file
f = open('config.ini', 'w')
config.write(f)
f.close()
# read config from file
config2 = configparser.ConfigParser()
config2.read('config.ini')
# ConfigParser objects are a lot like dictionaries, but if you really
# want a dictionary you can ask it to convert a section to a dictionary
dictA = dict(config2['dict1'] )
dictB = dict(config2['dict2'] )
dictC = dict(config2['dict3'])
print(dictA)
print(dictB)
print(dictC)
コンソール出力
{'key2': 'keyinfo2', 'key1': 'keyinfo'}
{'k1': 'hot', 'k2': 'cross', 'k3': 'buns'}
{'z': '3', 'y': '2', 'x': '1'}
config.iniの内容
[dict1]
key2 = keyinfo2
key1 = keyinfo
[dict2]
k1 = hot
k2 = cross
k3 = buns
[dict3]
z = 3
y = 2
x = 1
Jsonファイルに保存する場合、これを行う最も簡単で簡単な方法は次のとおりです。
import json
with open("file.json", "wb") as f:
f.write(json.dumps(dict).encode("utf-8"))