কীভাবে একটি ফাইল একটি অভিধান সংরক্ষণ করবেন?


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

এবং একই ফর্ম্যাট সহ একটি পাঠ্য ফাইলে ডিকটি কীভাবে সংরক্ষণ করবেন?

উত্তর:


258

পাইথনের এই ধরণের জিনিসটির জন্য আচারের মডিউল রয়েছে।

এই ফাংশনগুলি হ'ল প্রায় কোনও বিষয় সংরক্ষণ এবং লোড করার জন্য আপনার প্রয়োজনীয়:

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
@ টুথপিক অ্যানিমোন wb+ফাইল তৈরি করতে ব্যবহার করে, যেমন:with open('obj/'+ name + '.pkl', 'wb+')
andrey.s

1
@ andrey.s: আপনি যা বলছেন তাতে কোন পার্থক্য হবে বলে আমি মনে করি না কারণ এটি সমস্যার সমাধান করে না।
মার্টিনিউ

1
@ টুথপিক অ্যানিমোন: +মোডে একটি যুক্ত করা আপনার সমস্যার উপর কোনও প্রভাব ফেলবে না (Andrey.s ভুল)। আপনার সমস্যাটি মনে হয় এটি এক বা দুটি জিনিসের কারণে। জন্য 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"

এফওয়াইআই: এনপিওয়াই ফাইল ভিউয়ার


4
.item () কিসের জন্য?
গুলজার

@ জহ এর "আচার" উত্তরের চেয়ে এই উত্তরটি কেন কম প্রচারিত? আরও স্পেস-জটিল?
নাথান

1
@ ফ্র্যাঙ্ক সম্ভাবনা কারণ আচার পাইথনের স্ট্যান্ডার্ড লাইব্রেরির একটি অংশ যেখানে অদ্ভুত একটি স্বাধীন প্রকল্প।
ম্যাক্সিম ভেক্সলার 11

2
@ গুলজার আমি যা দেখেছিলাম সেখান থেকে, এনপি.লোড একটি নাদার্রে ফেরত দেয় (তাই একটি type(read_dictionary)প্রকাশ করে) এবং .item () মূলত সেই উপাদানটিকে একটি পাইথন স্ক্যালার অবজেক্টে রূপান্তরিত করে যা এখানে
অভয়দৈশ্রনেট

2
@ শাই আপনি কি নামী প্যাকেজটি ইনস্টল করেছেন ...?
ইবেন

26

আমরা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" ) )

এই সমাধানটি অনেকগুলি সুবিধা নিয়ে আসে , উদাহরণস্বরূপ অপরিবর্তিত আকারে পাইথন ২.x এবং পাইথন ৩.x এর জন্য কাজ করে এবং উপরন্তু, জেএসএন ফর্ম্যাটে সংরক্ষিত ডেটা সহজেই অনেকগুলি বিভিন্ন প্ল্যাটফর্ম বা প্রোগ্রামের মধ্যে স্থানান্তরিত করা যায় । এই তথ্যগুলি মানব-পঠনযোগ্য


ভাল পন্থা, তবে আমি মনে করি না যে এটি openতৈরি করা প্রসঙ্গে পরিবর্তে সরাসরি ব্যবহার করা নিরাপদ with। গ্যারান্টি আছে কি, json.dumpব্যর্থ হলে ফাইল হ্যান্ডেলটি বন্ধ হয়ে যাবে ?
ডাঃ_জাসজুয়ে

18

আমি নিশ্চিত না যে আপনার প্রথম প্রশ্নটি কী, তবে আপনি যদি ফাইলের জন্য একটি অভিধান সংরক্ষণ করতে চান তবে আপনার jsonলাইব্রেরিটি ব্যবহার করা উচিত । লোড এবং পুট ফাংশনগুলির ডকুমেন্টেশন সন্ধান করুন।


কেন জসন? "
Repr

5
@ এমগিজাইর তবে এটিকে আবার বিশ্লেষণ করা এতটা সহজ নয়। প্লাস জসন হ্যান্ড দ্বারা সম্পাদনা করা এবং অন্য কোনও প্রোগ্রামে আমদানি করা সহজ।
কালহার্ট

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.writ (':'। Join ([id] + value.split (':')) + '\ n') বৈশিষ্ট্য ত্রুটি: 'ডিক' অবজেক্টটির কোনও 'বিভাজন' নেই
শাই অ্যালন

@ শাইআলন: তাদের সবার সাথে নয়, না। এটা স্পষ্টভাবে আছে যাদের মান স্ট্রিং (ক আছে সঙ্গে কাজ split()পদ্ধতি) -যেটা এই প্রশ্নের বিষয়। দেখে মনে হচ্ছে আপনি অভিধানের অভিধানে এটি ব্যবহার করার চেষ্টা করছেন, সুতরাং এটির সাথে এটি কাজ করবে না। আমি লোকেদের কাছ থেকে ভোটের প্রশংসা করি না কারণ তারা সত্যই প্রশ্নটি বুঝতে পারে না (এবং এভাবে উত্তরগুলি সরবরাহ করা হচ্ছে)। আমি আমার উত্তরটি ব্যবহার করার সময় এটি যথাযথ হবে তা আপডেট করব update
মার্টিনিউ

3

আমি আপনার ডেটা আচার বিন্যাসের পরিবর্তে JSON ফর্ম্যাট ব্যবহার করে সংরক্ষণের পরামর্শ দেব কারণ JSON এর ফাইলগুলি মানব-পঠনযোগ্য যা আপনার ডেটা কম হওয়ায় আপনার ডিবাগিংটিকে আরও সহজ করে তোলে। JSON ফাইলগুলি অন্য প্রোগ্রামগুলি ডেটা পড়তে এবং লেখার জন্যও ব্যবহার করে। আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন

আপনাকে জেএসএন মডিউল ইনস্টল করতে হবে, আপনি পাইপ দিয়ে এটি করতে পারেন:

pip install json


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

এটি মাইফাইল নামটি সহ একটি জেসন ফাইল তৈরি করে।

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

এটি ডেটা অবজেক্টে myfile.json ডেটা পড়ে এবং সঞ্চয় করে।


2

আপনি যদি অভিধানটি না রাখতে চান তবে আমার মনে csvহয় ফাইলটি পড়ার জন্য পাইথন মডিউলটি ব্যবহার করা সবচেয়ে ভাল সমাধান to তারপরে, আপনি সারি ডেটা পান এবং আপনি 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:
রাজ্জি আর

1
প্রশ্নে, একটি dict ব্যবহার করা হয়েছিল যখন
সিএসভি

1

আমি এটির সময়সই করিনি তবে আমি বাজি ধরেছি যে এইচ 5 আচারের চেয়েও দ্রুত; সংকোচনের সাথে ফাইলসাইজটি প্রায় অবশ্যই ছোট।

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

ডিকে রূপান্তর করা এবং সংরক্ষণের কাজ করে না বিশেষত আপনি যখন স্ট্রিংগুলিতে পি.ডি.সারিজ বা এনপি.অ্যান্ডারিকে আপনার কী হিসাবে দেখান।
অর্পান শ্রীবাস্তব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.