web-dev-qa-db-ja.com

辞書をファイルに保存する方法

辞書の値を変更してその辞書をテキストファイルに保存するのに問題があります(形式は同じである必要があります)。私はmember_phoneフィールドを変更するだけです。

私のテキストファイルは次のフォーマットです:

memberID:member_name:member_email:member_phone

テキストファイルを次のように分割します。

mdict={}
for line in file:
    x=line.split(':')
    a=x[0]
    b=x[1]
    c=x[2]
    d=x[3]
    e=b+':'+c+':'+d

    mdict[a]=e

dに格納されているmember_phoneを変更しようとすると、キーによって値が流れずに変更されています。

def change(mdict,b,c,d,e):
    a=input('ID')
    if a in mdict:
        d= str(input('phone'))
        mdict[a]=b+':'+c+':'+d
    else:
        print('not')

そしてどのように同じ形式のテキストファイルに辞書を保存するのですか?

102
XueYuan Wang

Pythonはこのようなことのために pickle モジュールを持っています。

これらの関数は、ほとんどすべてのオブジェクトを保存およびロードするために必要なものすべてです。

def save_obj(obj, name ):
    with open('obj/'+ name + '.pkl', 'wb') as f:
        pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)

def load_obj(name ):
    with open('obj/' + name + '.pkl', 'rb') as f:
        return pickle.load(f)

これらの関数は現在の作業ディレクトリにobjフォルダがあると仮定しています。これはオブジェクトを格納するために使用されます。

Pickle.HIGHEST_PROTOCOLはバイナリ形式であり、必ずしも便利というわけではありませんが、パフォーマンスには適しています。プロトコル0はテキスト形式です。

Pythonのコレクションを保存するために shelve モジュールがあります。

207
Zah

Pickleはおそらく最良の選択肢ですが、NumPyを使って辞書をファイルに保存して読み込む方法を誰かが疑問に思う場合に備えて:

import numpy as np

# Save
dictionary = {'hello':'world'}
np.save('my_file.npy', dictionary) 

# Load
read_dictionary = np.load('my_file.npy').item()
print(read_dictionary['hello']) # displays "world"

FYI: NPYファイルビューア

134

私はあなたの最初の質問が何であるかわからないが、あなたがファイルに辞書を保存したいならあなたはjsonライブラリを使うべきです。ロードのドキュメントを調べて関数を置きます。

16
John

Dictをファイルに保存してロードします。

def save_dict_to_file(dic):
    f = open('dict.txt','w')
    f.write(str(dic))
    f.close()

def load_dict_from_file():
    f = open('dict.txt','r')
    data=f.read()
    f.close()
    return eval(data)
9
junglejet

あなたが扱っているもののような文字列の辞書のために、それはPythonの内蔵のテキスト処理能力だけを使ってされることができました。

(値が他のものである場合、これはうまくいかないことに注意してください。)

with open('members.txt') as file:
    mdict={}
    for line in file:
        a, b, c, d = line.strip().split(':')
        mdict[a] = b + ':' + c + ':' + d

a = input('ID: ')
if a not in mdict:
    print('ID {} not found'.format(a))
else:
    b, c, d = mdict[a].split(':')
    d = input('phone: ')
    mdict[a] = b + ':' + c + ':' + d  # update entry
    with open('members.txt', 'w') as file:  # rewrite file
        for id, values in mdict.items():
            file.write(':'.join([id] + values.split(':')) + '\n')
2
martineau

辞書やその他のデータを JSON の形式に簡単にマッピングできる場合は、jsonモジュールを使用することもできます。

データをファイルにシリアル化します。

import json
json.dump( data, open( "file_name.json", 'w' ) )

ファイルからデータを読み込む:

import json
data = json.load( open( "file_name.json" ) )

この解決法は多くの利点をもたらします。例えば、Python 2.xおよびPython 3.xに対して変更のない形式で動作します。 JSON形式で保存されたデータは、さまざまなプラットフォームやプログラム間で簡単に転送できます。このデータも人間が読むことができます。

2
simhumileco

本当に辞書を使いたくないのであれば、csv Pythonモジュールを使ってファイルを読むことが最善の解決策だと思います。それから、あなたはデータの行を取得し、あなたはmember_phoneまたはあなたが望むものは何でも変更することができます。最後に、csvモジュールをもう一度使用して、開いたときと同じ形式でファイルを保存できます。

読むためのコード:

import csv

with open("my_input_file.txt", "r") as f:
   reader = csv.reader(f, delimiter=":")
   lines = list(reader)

書くためのコード:

with open("my_output_file.txt", "w") as f:
   writer = csv.writer(f, delimiter=":")
   writer.writerows(lines)

もちろん、あなたはchange()関数を適合させる必要があります:

def change(lines):
    a = input('ID')
    for line in lines:
      if line[0] == a:
        d=str(input("phone"))
        line[3]=d
        break
    else:
      print "not"
2
mguijarr

迅速で汚い解決策:辞書を文字列に変換してファイルに保存します。例えば:

#dict could be anything:

savedict = open('savedict001.txt', 'w')
savedict.write(str(dict))
savedict.close()
1
Patrick Stacey

私は時間を計っていないが、私はh5がピクルスより速いと思う。圧縮によるファイルサイズはほぼ確実に小さくなります。

import deepdish as dd
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9))
1
wordsforthewise