পাইথন ডিককে স্ট্রিং এবং পিছনে রূপান্তর করুন


275

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

উত্তর:


273

জসন মডিউলটি এখানে একটি ভাল সমাধান। আচারের উপরে এর সুবিধাগুলি রয়েছে যে এটি কেবল প্লেইন পাঠ্য আউটপুট উত্পাদন করে এবং এটি ক্রস প্ল্যাটফর্ম এবং ক্রস সংস্করণ।

import json
json.dumps(dict)

2
আমি পাশাপাশি এই মডিউল এক নজরে নেওয়া হবে। জসন এবং আচার উভয়ই ব্যবহার করা যথেষ্ট সহজ বলে মনে হচ্ছে, তাই এটি ক্রস প্ল্যাটফর্ম সমর্থন হিসাবে নেমে আসবে। ধন্যবাদ
এজে 200200

5
এই মুহুর্তে আচারকে বরং অবচয় হিসাবে দেখা যায়। আমি সবসময় এই জাতীয় জিনিসগুলির জন্য json ব্যবহার করি। (তুলনামূলকভাবে) মানব পঠনযোগ্য হ'ল একটি বিগ প্লাস অনেক সময়।
টাইলার ইভস

30
ব্যবহারকারীরা কীভাবে এটি করতে পারে তা দেখার জন্য আপনার একটি সাধারণ উদাহরণ যুক্ত করা উচিত।
মিগুয়েল ওয়াজক

1
@ টাইলারএভস কীভাবে এটি করা উচিত তা উদাহরণ সরবরাহ করতে পারেন?
বোবান

1
: কপাল স্ল্যাপ: import jsonআমার মতো ভুলে যাবেন না !
জেসি চিশলম

207

যদি আপনার অভিধান খুব বড় না হয় তবে str + eval কাজটি করতে পারে:

dict1 = {'one':1, 'two':2, 'three': {'three.1': 3.1, 'three.2': 3.2 }}
str1 = str(dict1)

dict2 = eval(str1)

print dict1==dict2

তুমি ব্যবহার করতে পার উত্সটি যদি অবিশ্বস্ত থাকে তবে আপনি অতিরিক্ত সুরক্ষার জন্য .স্টের পরিবর্তে ast.literal_eval


13
কোডের সাথে পরিচিত হতে পারে এমন সম্ভাব্য ব্যবহারগুলি মোকাবিলায় আমি সত্যিই প্রস্তুত নই। জেসন বা আচারের কী কী সমস্যা থাকতে পারে তা আমি জানি না, তবে আমি জানি যে এই ক্ষেত্রে বিপদজনক হতে পারে।
AJ00200

5
@ AJ00200: এবং আমি উল্লেখ করেছি ast.literal_eval বিকল্প ?. পাইথন সহায়তা থেকে: "পাইথন এক্সপ্রেশন সম্বলিত একটি এক্সপ্রেশন নোড বা স্ট্রিং নিরাপদে মূল্যায়ন করুন provided "অমূল্যগুলির উত্স থেকে পাইথন এক্সপ্রেশন যুক্ত স্ট্রিংগুলি নিরাপদে মূল্যবোধগুলি বিশ্লেষণ না করে মূল্যায়নের জন্য ব্যবহার করা যেতে পারে।"
পাবলোজি

এটি দরকারী বলে মনে হচ্ছে তবে আমি যখন এই ডেটা হ্যান্ডেল করার জন্য এসকিউএলাইট ব্যবহার করছিলাম এবং এটিতে 1500 এরও বেশি এন্ট্রি ছিল, তাই এটি সর্বদা বেশ বড় এবং বর্ধমান।
AJ00200


14

pickleএটিকে ডিস্কে সংরক্ষণ করতে মডিউলটি ব্যবহার করুন এবং পরে লোড করুন।


2
@xtxton আসলে এটি প্রশ্নের উত্তর is এটি এটিকে কোথাও একটি স্ট্রিংয়ে রূপান্তরিত করে এবং এটি একটি ফাইলে লিখে দেয়। আমার আসল রূপান্তর বা ফাইল রাইটিং করতে হবে না কারণ এটি সমস্তই আচার দ্বারা আবদ্ধ।
এজে 200200

11

পাইথন 3 এর Inbuilt ব্যবহার না করার কেন AST লাইব্রেরির ফাংশন literal_eval । এটা ব্যবহার করা উত্তম literal_eval পরিবর্তে Eval

import ast
str_of_dict = "{'key1': 'key1value', 'key2': 'key2value'}"
ast.literal_eval(str_of_dict)

আসল অভিধান হিসাবে আউটপুট দেবে

{'key1': 'key1value', 'key2': 'key2value'}

এবং যদি আপনি কোনও স্ট্রিংয়ে একটি অভিধান রূপান্তর করতে বলছেন , তবে কীভাবে স্ট্রিং ব্যবহার করবেন () পাইথন পদ্ধতি।

ধরুন অভিধানটি হ'ল:

my_dict = {'key1': 'key1value', 'key2': 'key2value'}

এবং এটি এইভাবে করা হবে:

str(my_dict)

মুদ্রণ করবে:

"{'key1': 'key1value', 'key2': 'key2value'}"

আপনার পছন্দ মতো এটি সহজ।


5

চিনেসে থাকলে

import codecs
fout = codecs.open("xxx.json", "w", "utf-8")
dict_to_json = json.dumps({'text':"中文"},ensure_ascii=False,indent=2)
fout.write(dict_to_json + '\n')

1
আপনি প্রদত্ত কোডটি কীভাবে প্রশ্নের উত্তর দেয় তা যদি আপনি ব্যাখ্যা করেন তবে এটি আরও ভাল উত্তর হবে।
পিপ্পারি

4

অভিধানটিকে JSON (স্ট্রিং) এ রূপান্তর করুন

import json 

mydict = { "name" : "Don", 
          "surname" : "Mandol", 
          "age" : 43} 

result = json.dumps(mydict)

print(result[0:20])

আপনি পাবেন:

। "নাম": "ডন", "সুর"

স্ট্রিং অভিধানে রূপান্তর করুন

back_to_mydict = json.loads(result) 

3

আমি মনে করি আপনার shelveমডিউলটি ব্যবহার করা বিবেচনা করা উচিত যা ধ্রুবক ফাইল-ব্যাকযুক্ত অভিধানের মতো বস্তু সরবরাহ করে। একটি "আসল" অভিধানের জায়গায় এটি ব্যবহার করা সহজ কারণ এটি প্রায় স্বচ্ছভাবে আপনার প্রোগ্রামকে এমন কিছু সরবরাহ করে যা অভিধানের মতো ব্যবহার করা যেতে পারে, এটি স্পষ্টভাবে স্ট্রিংয়ে রূপান্তরিত করার প্রয়োজন ছাড়াই এবং পরে কোনও ফাইলকে লিখতে (বা ভাইস- বিপরীতভাবে)।

মূল পার্থক্যটি open()প্রথমটি ব্যবহারের আগে প্রথমে এটি করা দরকার এবং তারপরে close()এটি শেষ হয়ে গেলে (এবং সম্ভবত sync()এটির জন্য, উপর নির্ভর করেwriteback ব্যবহার বিকল্পটি ব্যবহৃত হচ্ছে )। যে কোনও "বালুচর" ফাইল অবজেক্ট তৈরি করে সেগুলিতে মান হিসাবে নিয়মিত অভিধান থাকতে পারে, এগুলি যুক্তিযুক্তভাবে বাসা বাঁধে।

এখানে একটি তুচ্ছ উদাহরণ:

import shelve

shelf = shelve.open('mydata')  # open for reading and writing, creating if nec
shelf.update({'one':1, 'two':2, 'three': {'three.1': 3.1, 'three.2': 3.2 }})
shelf.close()

shelf = shelve.open('mydata')
print shelf
shelf.close()

আউটপুট:

{'three': {'three.1': 3.1, 'three.2': 3.2}, 'two': 2, 'one': 1}

2

আপনি যদি গতির ব্যবহার উজসন (আলট্রাজসন) সম্পর্কে চিন্তা করেন তবে জিসনের মতো একই এপিআই রয়েছে:

import ujson
ujson.dumps([{"key": "value"}, 81, True])
# '[{"key":"value"},81,true]'
ujson.loads("""[{"key": "value"}, 81, true]""")
# [{u'key': u'value'}, 81, True]

1

আমি এর জন্য ইয়ামাল ব্যবহার করি যদি পড়ার দরকার হয় (জেএসওএন বা এক্সএমএল নয় যে আইএমএইচও নয়), বা পড়া প্রয়োজন না হলে আমি আচার ব্যবহার করি।

লিখন

from pickle import dumps, loads
x = dict(a=1, b=2)
y = dict(c = x, z=3)
res = dumps(y)
open('/var/tmp/dump.txt', 'w').write(res)

ফিরে পড়া

from pickle import dumps, loads
rev = loads(open('/var/tmp/dump.txt').read())
print rev

bএখানে ফাইল খোলার সময় আপনার পতাকাটি সত্যই ব্যবহার করা উচিত ।
পাইটার ডব্রোগস্ট

1
আমি আরও সুস্পষ্ট হতে পারে। তবে dumps()প্রোটোকল 0-এ ডিফল্ট, যা আসকি প্রোটোকল। এজন্য 'rb'প্রয়োজনীয় আইএমএইচও নয়।
জেরার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.