辞書の値を変更してその辞書をテキストファイルに保存するのに問題があります(形式は同じである必要があります)。私は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')
そしてどのように同じ形式のテキストファイルに辞書を保存するのですか?
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 モジュールがあります。
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ファイルビューア
私はあなたの最初の質問が何であるかわからないが、あなたがファイルに辞書を保存したいならあなたはjson
ライブラリを使うべきです。ロードのドキュメントを調べて関数を置きます。
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)
あなたが扱っているもののような文字列の辞書のために、それは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')
辞書やその他のデータを 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形式で保存されたデータは、さまざまなプラットフォームやプログラム間で簡単に転送できます。このデータも人間が読むことができます。
本当に辞書を使いたくないのであれば、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"
迅速で汚い解決策:辞書を文字列に変換してファイルに保存します。例えば:
#dict could be anything:
savedict = open('savedict001.txt', 'w')
savedict.write(str(dict))
savedict.close()
私は時間を計っていないが、私はh5がピクルスより速いと思う。圧縮によるファイルサイズはほぼ確実に小さくなります。
import deepdish as dd
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9))