फ़ाइल में शब्दकोश कैसे बचाएं?


139

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

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

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

जवाबों:


259

इस तरह की चीज़ के लिए पाइथन में अचार मॉड्यूल है।

ये सभी कार्य लगभग किसी भी वस्तु को बचाने और लोड करने के लिए आवश्यक हैं:

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एक पाठ प्रारूप है।

पायथन के संग्रह को बचाने के लिए शेल्व मॉड्यूल है।


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

1
@ToothpickAnemone wb+फ़ाइल बनाने के लिए उपयोग करते हैं, अर्थात:with open('obj/'+ name + '.pkl', 'wb+')
andrey.s

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

1
@Toothpick एनीमोन: +मोड में जोड़ने से आपकी समस्या पर कोई प्रभाव नहीं पड़ेगा (andrey.s is wrong)। आपकी समस्या यह लगती है कि यह एक या दो चीजों के कारण है। के लिए save_obj()काम करने के लिए इस सवाल का जवाब में, नाम वाली उप "obj"चाहिए पहले से ही मौजूद है क्योंकि open()स्वचालित रूप से एक नहीं बनाएगा। दूसरा तर्क save_obj()है कि पायथन ऑब्जेक्ट को बचाया जाना है, न कि उपनिर्देशिका का नाम (हालांकि यह पूरी तरह से स्पष्ट नहीं Qहै कि उदाहरण save_obj(Q, "Qtable")कॉल में आपका क्या मतलब है )। यदि आप पहले से ही बाहर नहीं निकलते हैं तो आप एक निर्देशिका बना सकते हैं os.mkdir()
मार्टीन्यू

168

अचार शायद सबसे अच्छा विकल्प है, लेकिन मामले में किसी को भी आश्चर्य होता है कि NumPy का उपयोग करके किसी फ़ाइल में शब्दकोश को कैसे सहेजा और लोड किया जाए:

import numpy as np

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

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

FYI करें: NPY फ़ाइल दर्शक


4
इसके लिए .item () क्या है?
गुलज़ार

यह उत्तर @Zah के "अचार" के उत्तर से कम क्यों है? अधिक स्थान-जटिल?
नाथन

1
@frank संभावना है क्योंकि अचार अजगर के मानक पुस्तकालय का हिस्सा है जहां सुपी एक स्वतंत्र परियोजना है।
मैक्सिम वीक्स्लर

2
@ गुलज़ार ने जो मुझे देखा, उससे np.load एक ndarray देता है (ऐसा type(read_dictionary)खुलासा करता है) और .item () मूल रूप से उस तत्व को एक पाइथन स्केलर ऑब्जेक्ट में परिवर्तित करता है जो कि एक शब्दकोश है जैसा कि यहाँ
abhyudayasrinet

2
@ क्या आपने खस्ता पैकेज स्थापित किया है ...?
Eben

26

हमjson मामले में मॉड्यूल का उपयोग भी कर सकते हैं जब शब्दकोशों या कुछ अन्य डेटा को आसानी से JSON प्रारूप में मैप किया जा सकता है ।

import json

# Serialize data into file:
json.dump( data, open( "file_name.json", 'w' ) )

# Read data from file:
data = json.load( open( "file_name.json" ) )

यह समाधान कई लाभ लाता है , जैसे अपरिवर्तित रूप में अजगर 2.x और पायथन 3.x के लिए काम करता है और इसके अलावा, JSON प्रारूप में सहेजे गए डेटा को आसानी से कई अलग-अलग प्लेटफार्मों या कार्यक्रमों के बीच स्थानांतरित किया जा सकता है । यह डेटा मानव-पठनीय भी हैं


अच्छा दृष्टिकोण, लेकिन मुझे नहीं लगता कि इसके openद्वारा बनाए गए संदर्भ के बजाय सीधे उपयोग करना सुरक्षित है with। क्या कोई गुरुमंत्र है, json.dumpविफल होने पर फ़ाइल हैंडल बंद हो जाएगा ?
Dr_Zaszuś

18

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


क्यों जसन? "
रेप

5
@mguijarr लेकिन इसे वापस पार्स करना उतना आसान नहीं है। प्लस जसन को हाथ से संपादित करना और किसी अन्य कार्यक्रम में आयात करना आसान है।
कलहर्ट

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

9

फ़ाइल को सहेजें और लोड करें:

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)

3

स्ट्रिंग्स के एक शब्दकोश जैसे कि आप जिस के साथ काम कर रहे हैं, उसके लिए यह केवल पायथन के अंतर्निहित टेक्स्ट प्रोसेसिंग क्षमताओं का उपयोग करके किया जा सकता है।

(ध्यान दें कि यह काम नहीं करेगा यदि मान कुछ और हैं।)

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

यह शब्दकोशों पर काम नहीं करता है: file.write (':'। join ([id] + values.split (':')) + '\ n') AttractError: 'dict' ऑब्जेक्ट में कोई विशेषता 'स्प्लिट' नहीं है
Shai Alon

@ शीलॉन: उन सभी के साथ नहीं। यह निश्चित रूप से उन लोगों के साथ काम करता है जिनके मूल्य तार हैं (कि एक split()विधि है) - जो इस प्रश्न का विषय है। ऐसा लगता है कि आप इसे शब्दकोश के शब्दकोश में उपयोग करने की कोशिश कर रहे हैं, इसलिए यह उन लोगों के साथ काम नहीं करेगा। मैं लोगों से मतों की सराहना नहीं करता क्योंकि वे वास्तव में प्रश्न को नहीं समझते हैं (और इस प्रकार दिए जा रहे उत्तरों का संदर्भ)। मैं अपना उत्तर अपडेट करते समय करूंगा कि यह उचित होगा, इसलिए कृपया अपने डाउन-वोट को पूर्ववत करें।
मार्टिन

3

मेरा सुझाव है कि अचार प्रारूप के बजाय JSON प्रारूप का उपयोग करके आपके डेटा को सहेजना होगा क्योंकि JSON की फाइलें मानव-पठनीय हैं जो आपके डीबगिंग को आसान बनाता है क्योंकि आपका डेटा छोटा है। JSON फ़ाइलों का उपयोग अन्य कार्यक्रमों द्वारा डेटा पढ़ने और लिखने के लिए भी किया जाता है। आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं

आपको JSON मॉड्यूल को स्थापित करने की आवश्यकता होगी, आप पाइप से ऐसा कर सकते हैं:

pip install json


# To save the dictionary into a file:
json.dump( data, open( "myfile.json", 'w' ) )

यह myfile नाम के साथ एक json फ़ाइल बनाता है।

# To read data from file:
data = json.load( open( "myfile.json" ) )

यह डेटा ऑब्जेक्ट में myfile.json डेटा को पढ़ता है और संग्रहीत करता है।


2

जब तक आप वास्तव में शब्दकोश को रखना चाहते हैं, मुझे लगता है csvकि फ़ाइल को पढ़ने के लिए पायथन मॉड्यूल का उपयोग करना सबसे अच्छा उपाय है । फिर, आपको डेटा की पंक्तियाँ मिलती हैं और आप 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"

इसका क्या अर्थ हैOf course, you need to adapt your change() function:
kRazzy R

1
प्रश्न में, एक dict का उपयोग किया गया था जबकि सीएसवी एक सूची की तरह अधिक काम करता है
mguijarr

1

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

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

-2

त्वरित और गंदा समाधान: ताना को स्ट्रिंग में बदलें और फ़ाइल में सहेजें, जैसे:

#dict could be anything:

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

स्ट्रेट और सेविंग के लिए तानाशाही को परिवर्तित करना विशेष रूप से तब काम नहीं करता है जब आपके पास पीडीएस या स्ट्रिंग्स में आपकी चाबियाँ के रूप में np.ndarray हो।
अर्पण श्रीवास्तव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.