2013-10-05 27 views
54

मुझे एक dict value बदलने और एक फ़ाइल फ़ाइल में दस्तावेज़ को सहेजने में समस्या है (प्रारूप समान होना चाहिए), मैं केवल 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 

जब मैं बदल member_phoned में संग्रहीत की कोशिश, मूल्य प्रवाह नहीं बदला है कुंजी द्वारा,

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') 

और कैसे टी टी को बचाने के लिए ओ एक प्रारूप के साथ एक पाठ फ़ाइल?

उत्तर

7

मुझे यकीन नहीं है कि आपका पहला प्रश्न क्या है, लेकिन यदि आप किसी फ़ाइल में एक शब्दकोश को सहेजना चाहते हैं तो आपको शायद जेसन लाइब्रेरी का उपयोग करना चाहिए। लोड के दस्तावेज़ीकरण को देखो और कार्यों को रखता है।

+0

क्यों जेसन? पाइथन शब्दकोष को "repr" – mguijarr

+2

@mguijarr का उपयोग करके फ़ाइल में डंप करना और भी आसान है, लेकिन इसे वापस पार्स करना उतना आसान नहीं है। प्लस जेसन हाथ से संपादित करना और किसी भी अन्य कार्यक्रम में आयात करना आसान है। – kalhartt

+0

मुझे जॉन के सुझाव पसंद हैं - इस पोस्ट को एक अच्छे और सरल उदाहरण के लिए देखें http://stackoverflow.com/a/11027021/765827 – jacanterbury

119

पायथन के पास इस तरह की चीज़ के लिए 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 एक पाठ प्रारूप है।

पायथन के संग्रह को सहेजने के लिए shelve मॉड्यूल है।

+0

'save_obj' को लगता है कि फ़ाइल 'obj /' + name + '.pkl' पहले से ही है मौजूद। मैंने 'क्यू' नामक एक शब्दकोश बनाया, इसे पॉप्युलेट किया, और 'save_obj (क्यू, "क्यूटेबल") कॉल किया, मुझे एक त्रुटि मिली:' FileNotFoundError: [Errno 2] ऐसी कोई फ़ाइल या निर्देशिका नहीं: 'obj/Qtable.pkl '' इसे लिखने से पहले फ़ाइल को पहली जगह कैसे बनाते हैं? –

+1

@ टूथपिकएनेमोन फ़ाइल बनाने के लिए 'wb + 'का उपयोग करें, यानी:' ओपन ('obj /' + name + '.pkl', 'wb +') ' –

+0

@ andrey.s: मुझे नहीं लगता कि आप क्या कहेंगे कोई फर्क नहीं पड़ता क्योंकि यह समस्या का समाधान नहीं करता है। – martineau

2

जब तक आप वास्तव में शब्दकोश रखना नहीं चाहते हैं, मुझे लगता है कि फ़ाइल पढ़ने के लिए csv पायथन मॉड्यूल का उपयोग करना सबसे अच्छा समाधान है। फिर, आपको डेटा की पंक्तियां मिलती हैं और आप member_phone या जो भी चाहें बदल सकते हैं; अंत में, आप फ़ाइल को उसी प्रारूप में सहेजने के लिए csv मॉड्यूल का उपयोग कर सकते हैं जैसे ही आपने इसे खोला था।पढ़ने के लिए

कोड: लेखन के लिए

import csv 

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

कोड:

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" 
+0

इसका मतलब क्या है 'बेशक, आपको अपने परिवर्तन() फ़ंक्शन को अनुकूलित करने की आवश्यकता है: प्रश्न में ' –

+1

,' dict' का उपयोग किया गया था जबकि सीएसवी एक सूची की तरह काम करता है – mguijarr

3

यहाँ यह कैसे किया जा सकता है:

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

बेशक, आप अपने change() समारोह अनुकूलित करने की आवश्यकता केवल पायथन की अंतर्निहित टेक्स्ट प्रोसेसिंग क्षमताओं का उपयोग करके:

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') 
60

अचार शायद सबसे अच्छा विकल्प है, लेकिन 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 file viewer

2

मैं समय नहीं है लेकिन मैं शर्त लगाता हूं कि एच 5 अचार की तुलना में तेज़ है; संपीड़न के साथ फाइलसाइज लगभग निश्चित रूप से छोटा है।

import deepdish as dd 
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9)) 
संबंधित मुद्दे