পাইথন অভিধান সংরক্ষণ করা


197

আমি .csv ফাইলগুলি ব্যবহার করে পাইথনের ডেটা আনতে এবং আউট করতে অভ্যস্ত, তবে এর মধ্যে সুস্পষ্ট চ্যালেঞ্জ রয়েছে। কোনও অভিধান (বা অভিধানের সেটগুলি) কোনও জসন বা পিসি ফাইলে সংরক্ষণ করার সহজ উপায় সম্পর্কে কোনও পরামর্শ? উদাহরণ স্বরূপ:

data = {}
data ['key1'] = "keyinfo"
data ['key2'] = "keyinfo2"

আমি কীভাবে এটি সংরক্ষণ করব এবং তারপরে কীভাবে এটি আবার লোড করব তা উভয়ই জানতে চাই।


8
আপনি কি জসন বা আচার স্ট্যান্ডার্ড মডিউলগুলির জন্য ডকুমেন্টেশন পড়েছেন ?
গ্রেগ হিউগিল

উত্তর:


441

আচার সংরক্ষণ:

try:
    import cPickle as pickle
except ImportError:  # python 3.x
    import pickle

with open('data.p', 'wb') as fp:
    pickle.dump(data, fp, protocol=pickle.HIGHEST_PROTOCOL)

যুক্তি সম্পর্কিত অতিরিক্ত তথ্যের জন্য আচার মডিউল ডকুমেন্টেশন দেখুন protocol

আচার লোড:

with open('data.p', 'rb') as fp:
    data = pickle.load(fp)

JSON সংরক্ষণ করুন:

import json

with open('data.json', 'w') as fp:
    json.dump(data, fp)

সুন্দর ফলাফল পেতে sort_keysবা indentপেতে অতিরিক্ত যুক্তি সরবরাহ করুন । আর্গুমেন্ট সাজ্ট_কিগুলি কীগুলি বর্ণমালা অনুসারে বাছাই করবে এবং ইনডেন্ট আপনার ডেটা স্ট্রাকচারকে ফাঁকা স্থান সহ ইনডেন্ট করবে indent=N

json.dump(data, fp, sort_keys=True, indent=4)

JSON লোড:

with open('data.json', 'r') as fp:
    data = json.load(fp)

4
জেএসএন স্থানীয়ভাবে অভিধানগুলি করে (যদিও তারা স্পষ্টতই অজগর অভিধানের মতো ঠিক তেমন আচরণ করে না স্মৃতিতে থাকার সময়, অধ্যবসায়ের উদ্দেশ্যে, তারা অভিন্ন)। প্রকৃতপক্ষে, জসনের মূল এককটি "অবজেক্ট", যা {<স্ট্রিং>: <মূল্য> as হিসাবে সংজ্ঞায়িত} চেনা চেনা? স্ট্যান্ডার্ড লাইব্রেরিতে জসন মডিউল প্রতিটি পাইথন নেটিভ টাইপ সমর্থন করে এবং ব্যবহারকারী-সংজ্ঞায়িত ক্লাসগুলিকে সমর্থন করার জন্য সহজেই জেসন এর একটি ন্যূনতম জ্ঞানের সাহায্যে প্রসারিত হতে পারে। JSON হোমপেজটি কেবলমাত্র 3 টিরও বেশি মুদ্রিত পৃষ্ঠাগুলিতে সম্পূর্ণরূপে ভাষাটি সংজ্ঞায়িত করে, তাই এটি দ্রুত শোষণ / হজম করা সহজ।
জোনাথনব

1
pickle.dumpএটিও তৃতীয় তর্ক সম্পর্কে জানার মতো। যদি ফাইলটি মানব-পঠনযোগ্য না হয় তবে এটি জিনিসগুলিকে অনেক বেশি গতিতে পারে।
স্টিভ জেসোপ

11
আপনি যদি ডাম্প কলে सॉर्ट_কি এবং ইন্ডেন্ট যুক্তি যুক্ত করেন তবে আপনি অনেক সুন্দর ফলাফল পাবেন result উদাহরণ: json.dump(data, fp, sort_keys=True, indent=4)। আরও তথ্য এখানে
জুলিউস্ম

1
আপনার সম্ভবত ব্যবহার করা উচিতpickle.dump(data, fp, protocol=pickle.HIGHEST_PROTOCOL)
মার্টিন থোমা

1
অজগর 3 এর জন্য, ব্যবহার করুনimport pickle
বিপদে 89

35

সর্বনিম্ন উদাহরণ, সরাসরি কোনও ফাইলে লেখা:

import json
json.dump(data, open(filename, 'wb'))
data = json.load(open(filename))

বা নিরাপদে খোলা / বন্ধ:

import json
with open(filename, 'wb') as outfile:
    json.dump(data, outfile)
with open(filename) as infile:
    data = json.load(infile)

যদি আপনি এটি কোনও ফাইলের পরিবর্তে স্ট্রিংয়ে সংরক্ষণ করতে চান:

import json
json_str = json.dumps(data)
data = json.loads(json_str)


5

একটি ফাইল লিখতে:

import json
myfile.write(json.dumps(mydict))

একটি ফাইল থেকে পড়তে:

import json
mydict = json.loads(myfile.read())

myfile আপনি যে ফাইলটিতে ডিকটি সংরক্ষণ করেছেন সেই ফাইলের জন্য ফাইল অবজেক্ট।


আপনারা কি সতর্ক হন যে জসনের কাছে ফাইলগুলি আর্গুমেন্ট হিসাবে গ্রহণ করে এবং সরাসরি তা লিখতে পারে?

json.dump(myfile)এবংjson.load(myfile)
নিক্লাস আর

5

আপনি যদি সিরিয়ালাইজেশনের পরে থাকেন তবে অন্য প্রোগ্রামগুলিতে ডেটার প্রয়োজন হয় না আমি shelveমডিউলটিকে দৃ strongly়ভাবে প্রস্তাব করি । এটিকে অবিরাম অভিধান হিসাবে ভাবেন।

myData = shelve.open('/path/to/file')

# check for values.
keyVar in myData

# set values
myData[anotherKey] = someValue

# save the data for future use.
myData.close()

2
যদি আপনি একটি সম্পূর্ণ ডিক সঞ্চয় করতে চান বা একটি সম্পূর্ণ ডিক লোড করতে চান তবে jsonএটি আরও সুবিধাজনক। shelveএকবারে একটি চাবি অ্যাক্সেস করার জন্য কেবল ভাল।
agf

3

আপনি pickleবা এর বিকল্প চাইলে json, আপনি এটি ব্যবহার করতে পারেন klepto

>>> init = {'y': 2, 'x': 1, 'z': 3}
>>> import klepto
>>> cache = klepto.archives.file_archive('memo', init, serialized=False)
>>> cache        
{'y': 2, 'x': 1, 'z': 3}
>>>
>>> # dump dictionary to the file 'memo.py'
>>> cache.dump() 
>>> 
>>> # import from 'memo.py'
>>> from memo import memo
>>> print memo
{'y': 2, 'x': 1, 'z': 3}

সঙ্গে klepto, আপনি যদি ব্যবহার করেছিল serialized=True, অভিধান লেখা হত memo.pklএকটি জরা অভিধান হিসাবে পরিবর্তে সাফ পাঠ্যের সাথে।

আপনি kleptoএখানে পেতে পারেন : https://github.com/uqfoundation/klepto

dillসম্ভবত pickleনিজেই পিকিংয়ের জন্য আরও ভাল পছন্দ , যেহেতু dillপাইথনের প্রায় কোনও কিছুই সিরিয়ালাইজ করতে পারে। kleptoএছাড়াও ব্যবহার করতে পারেন dill

আপনি dillএখানে পেতে পারেন : https://github.com/uqfoundation/dill

প্রথম কয়েকটি লাইনে অতিরিক্ত মম্বো-জাম্বো হ'ল কারণ অভিধানটি kleptoকোনও ফাইল, ডিরেক্টরি প্রসঙ্গে বা একটি এসকিউএল ডাটাবেসে সংরক্ষণ করতে কনফিগার করা যায়। আপনি ব্যাকএন্ড সংরক্ষণাগার হিসাবে যা পছন্দ করেন তার জন্য এপিআই একই। এটি আপনাকে একটি "সংরক্ষণাগারযোগ্য" অভিধান দেয় যার সাহায্যে আপনি সংরক্ষণাগারটির সাথে ইন্টারেক্ট করতে loadএবং ব্যবহার করতে পারেন dump


3

এটি একটি পুরানো বিষয়, তবে সম্পূর্ণতার জন্য আমাদের কনফিগার পার্সার এবং কনফিগার পার্সার অন্তর্ভুক্ত করা উচিত যা যথাক্রমে পাইথন 2 এবং 3 এর স্ট্যান্ডার্ড লাইব্রেরির অংশ। এই মডিউলটি একটি কনফিগারেশন / আইএনআই ফাইল পড়ে এবং লেখায় এবং (অন্তত পাইথন 3 এ) অভিধানের মতো অনেকগুলি আচরণ করে। এটির অতিরিক্ত সুবিধা রয়েছে যে আপনি একাধিক অভিধান আপনার নিজের কনফিগার / আইআই ফাইলের পৃথক বিভাগে সংরক্ষণ করতে পারেন এবং সেগুলি পুনরায় স্মরণ করতে পারেন। খুব সুন্দর!

পাইথন 2.7.x উদাহরণ।

import ConfigParser

config = ConfigParser.ConfigParser()

dict1 = {'key1':'keyinfo', 'key2':'keyinfo2'}
dict2 = {'k1':'hot', 'k2':'cross', 'k3':'buns'}
dict3 = {'x':1, 'y':2, 'z':3}

# make each dictionary a separate section in config
config.add_section('dict1')
for key in dict1.keys():
    config.set('dict1', key, dict1[key])

config.add_section('dict2')
for key in dict2.keys():
    config.set('dict2', key, dict2[key])

config.add_section('dict3')
for key in dict3.keys():
    config.set('dict3', key, dict3[key])

# save config to file
f = open('config.ini', 'w')
config.write(f)
f.close()

# read config from file
config2 = ConfigParser.ConfigParser()
config2.read('config.ini')

dictA = {}
for item in config2.items('dict1'):
    dictA[item[0]] = item[1]

dictB = {}
for item in config2.items('dict2'):
    dictB[item[0]] = item[1]

dictC = {}
for item in config2.items('dict3'):
    dictC[item[0]] = item[1]

print(dictA)
print(dictB)
print(dictC)

পাইথন 3.X উদাহরণ।

import configparser

config = configparser.ConfigParser()

dict1 = {'key1':'keyinfo', 'key2':'keyinfo2'}
dict2 = {'k1':'hot', 'k2':'cross', 'k3':'buns'}
dict3 = {'x':1, 'y':2, 'z':3}

# make each dictionary a separate section in config
config['dict1'] = dict1
config['dict2'] = dict2
config['dict3'] = dict3

# save config to file
f = open('config.ini', 'w')
config.write(f)
f.close()

# read config from file
config2 = configparser.ConfigParser()
config2.read('config.ini')

# ConfigParser objects are a lot like dictionaries, but if you really
# want a dictionary you can ask it to convert a section to a dictionary
dictA = dict(config2['dict1'] )
dictB = dict(config2['dict2'] )
dictC = dict(config2['dict3'])

print(dictA)
print(dictB)
print(dictC)

কনসোল আউটপুট

{'key2': 'keyinfo2', 'key1': 'keyinfo'}
{'k1': 'hot', 'k2': 'cross', 'k3': 'buns'}
{'z': '3', 'y': '2', 'x': '1'}

কনফিগারেশন আইটি

[dict1]
key2 = keyinfo2
key1 = keyinfo

[dict2]
k1 = hot
k2 = cross
k3 = buns

[dict3]
z = 3
y = 2
x = 1

1

যদি কোনও জেসন ফাইলটিতে সংরক্ষণ করা হয় তবে এটি করার সর্বোত্তম এবং সহজ উপায় হ'ল:

import json
with open("file.json", "wb") as f:
    f.write(json.dumps(dict).encode("utf-8"))

json.dump( )এটি অন্যান্য উত্তরের হিসাবে বর্ণিত চেয়ে সহজ কেন ?
বাক্সেক্স

0

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

কোনও ফাইলে একাধিক এন্ট্রি সংরক্ষণ করতে, অবশ্যই পুরানো সামগ্রী (যেমন লেখার আগে পড়ুন) যাচাই করতে হবে। একটি সাধারণ ফাইল হোল্ডিং জসন ডেটাতে হয় একটি listবা objectমূল হিসাবে have সুতরাং আমি বিবেচনা করেছি যে আমার জাসন ফাইলটিতে সর্বদা একটি list of objectsএবং আমি যখনই এটিতে ডেটা যুক্ত করি, আমি প্রথমে তালিকাটি প্রথমে লোড করি, আমার নতুন ডেটা এতে যুক্ত করি এবং কেবল ফাইলের লিখিতযোগ্য দৃষ্টিতে এটিকে আবার ফেলে দিতে পারি w:

def saveJson(url,sc): #this function writes the 2 values to file
    newdata = {'url':url,'sc':sc}
    json_path = "db/file.json"

    old_list= []
    with open(json_path) as myfile:  #read the contents first
        old_list = json.load(myfile)
    old_list.append(newdata)

    with open(json_path,"w") as myfile:  #overwrite the whole content
        json.dump(old_list,myfile,sort_keys=True,indent=4)

    return "sucess"

নতুন জেসন ফাইলটি এর মতো দেখতে পাবেন:

[
    {
        "sc": "a11",
        "url": "www.google.com"
    },
    {
        "sc": "a12",
        "url": "www.google.com"
    },
    {
        "sc": "a13",
        "url": "www.google.com"
    }
]

উল্লেখ্য: এটা নামের একটি ফাইল আছে অপরিহার্য file.jsonসঙ্গে []কাজ এই পদ্ধতির জন্য প্রারম্ভিক তথ্য হিসাবে

পিএস: মূল প্রশ্নের সাথে সম্পর্কিত নয়, তবে আমাদের এন্ট্রি ইতিমধ্যে (1 / একাধিক কীগুলির ভিত্তিতে) উপস্থিত রয়েছে কিনা তা পরীক্ষা করে এই পদ্ধতির আরও উন্নতি করা যেতে পারে এবং কেবল তখনই ডেটা সংযোজন এবং সংরক্ষণ করা যায়। কারও যদি সেই চেক প্রয়োজন হয় তা আমাকে জানান, আমি উত্তরে যুক্ত করব

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