2011-02-04 23 views
44

私は私がファイルに辞書を保存するためにピクルスを使用するように言われた頼ま別の質問にいくつかのアドバイスをして[OK]を Pythonで辞書をファイルに保存する(pickleの代わりに)?

とにかく最後に、私はピクルスと一緒に行くことになったに答えました。

ピクルスがファイルに保存されたとき、私は、ファイルに保存しようとしていた辞書は、これは形式

(dp0 
S'Test' 
p1 
S'Test1' 
p2 
sS'Test2' 
p3 
S'Test2' 
p4 
sS'Starspy' 
p5 
S'SHSN4N' 
p6 
s. 

あなたが私に与えてくださいすることができました...

members = {'Starspy' : 'SHSN4N', 'Test' : 'Test1'} 

ました文字列をファイルに保存する別の方法は?

これは私はそれが= { 'Starspy': 'SHSN4N'、 'テスト': 'Test1を'}

メンバーに保存したいフォーマットで

完全コード:

import sys 
import shutil 
import os 
import pickle 

tmp = os.path.isfile("members-tmp.pkl") 
if tmp == True: 
    os.remove("members-tmp.pkl") 
shutil.copyfile("members.pkl", "members-tmp.pkl") 

pkl_file = open('members-tmp.pkl', 'rb') 
members = pickle.load(pkl_file) 
pkl_file.close() 

def show_menu(): 
    os.system("clear") 
    print "\n","*" * 12, "MENU", "*" * 12 
    print "1. List members" 
    print "2. Add member" 
    print "3. Delete member" 
    print "99. Save" 
    print "0. Abort" 
    print "*" * 28, "\n" 
    return input("Please make a selection: ") 

def show_members(members): 
    os.system("clear") 
    print "\nNames", "  ", "Code" 
    for keys in members.keys(): 
     print keys, " - ", members[keys] 

def add_member(members): 
    os.system("clear") 
    name = raw_input("Please enter name: ") 
    code = raw_input("Please enter code: ") 
    members[name] = code 
    output = open('members-tmp.pkl', 'wb') 
    pickle.dump(members, output) 
    output.close() 
    return members 


#with open("foo.txt", "a") as f: 
#  f.write("new line\n") 

running = 1 

while running: 
    selection = show_menu() 
    if selection == 1: 
     show_members(members) 
     print "\n> " ,raw_input("Press enter to continue") 
    elif selection == 2: 
     members == add_member(members) 
     print members 
     print "\n> " ,raw_input("Press enter to continue") 
    elif selection == 99: 
     os.system("clear") 
     shutil.copyfile("members-tmp.pkl", "members.pkl") 
     print "Save Completed" 
     print "\n> " ,raw_input("Press enter to continue") 

    elif selection == 0: 
     os.remove("members-tmp.pkl") 
     sys.exit("Program Aborted") 
    else: 
     os.system("clear") 
     print "That is not a valid option!" 
     print "\n> " ,raw_input("Press enter to continue") 
+2

フォーマットに問題がありますか?どのようにそれが欲しいですか? –

+0

通常の辞書として保存します。メンバーは{= Starspy ':' SHSN4N '、' Test ':' Test1 '} – wKavey

+1

[Storing Python dictionaries](http://stackoverflow.com/q/7100125/562769) –

答えて

58

確かに、CSVとして保存します。そして、

import csv 
w = csv.writer(open("output.csv", "w")) 
for key, val in dict.items(): 
    w.writerow([key, val]) 

それは次のようになり読み:

import csv 
dict = {} 
for key, val in csv.reader(open("input.csv")): 
    dict[key] = val 

もう一つの選択肢は、(バージョン2.6+のためjson、または下記2.5のためsimplejsonをインストールして)JSONのようになります。(PyYAMLと経由)

>>> import json 
>>> dict = {"hello": "world"} 
>>> json.dumps(dict) 
'{"hello": "world"}' 
+0

を参照してください。ファイル? – wKavey

+0

うん、私の編集を参照してください。 –

+0

ああ、これは私が言うことができる限り動作します。バンドルありがとう! – wKavey

6

YAMLフォーマットはあなたのために良い選択肢かもしれません。

http://en.wikipedia.org/wiki/Yaml

http://pypi.python.org/pypi/PyYAML

+1

それは素晴らしいアイデアです。唯一の問題は、外部モジュールが必要だということです。 –

+1

外部依存関係は迷惑ですが、YAMLはかわいいです:) –

52

今日最も一般的なシリアライズ形式はJSONです。これは普遍的にサポートされており、辞書のような単純なデータ構造をはっきりと表しています。

>>> members = {'Starspy' : 'SHSN4N', 'Test' : 'Test1'} 
>>> json.dumps(members) 
'{"Test": "Test1", "Starspy": "SHSN4N"}' 
>>> json.loads(json.dumps(members)) 
{u'Test': u'Test1', u'Starspy': u'SHSN4N'} 
+2

病気はそれを撃つ。どのファイルをどのファイルにダンプするか/ロードするかを指定するにはどうすればよいですか? – wKavey

+9

Dumpは文字列を返します。あなたは通常のpython IO 'のように、open( 'file.json'、 'w')をf:f.write(json.dumps(members))のように任意のファイルに書くことができます。' –

+0

jsonのuは何ですか?フォーマットを読み込む? –

0

私はあなたが代わりをしたい場合、あなたはkleptoを使用することができ、pickleをお勧めしたいしながら。 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} 

あなたがserialized=Trueを使用した場合、辞書は漬け辞書としての代わりに、クリアテキストでmemo.pklに書き込まれていたであろう。

あなたがここにklepto得ることができます:dillはPythonでほとんど何をシリアル化できるようhttps://github.com/uqfoundation/klepto

dillは、おそらくその後、pickle自体を酸洗ためのより良い選択です。 kleptodillを使用できます。

あなたがここにdill得ることができます:pp.pprint(the_dict)とは異なり、これはのようにきれいではありません、str()は少なくとも迅速なタスクのための簡単な方法で辞書が保存可能になり、一緒に実行されます、がhttps://github.com/uqfoundation/dill

6

を:

f.write(str(the_dict)) 
+0

Python 3.2以降、この保存された文字列オブジェクトは['ast.literal_eval'](https://docs.python.org/3/library/ast.html#ast.literal_eval)でインポートできます。 – Chris

3

あなたasked

病気はそれに打撃を与えます。どのファイルをどのファイルにダンプするか/ロードするかを指定するにはどうすればよいですか?

は別に、文字列への書き込みから、jsonモジュールはファイルに書き込まれ、dump() -methodを提供しています。

>>> a = {'hello': 'world'} 
>>> import json 
>>> json.dump(a, file('filename.txt', 'w')) 
>>> b = json.load(file('filename.txt')) 
>>> b 
{u'hello': u'world'} 

はあまりにも、読書のためのload()方法があります。

関連する問題