एक अजगर को एक स्ट्रिंग और पीठ में परिवर्तित करें


275

मैं एक प्रोग्राम लिख रहा हूं जो डेटा को डिक्शनरी ऑब्जेक्ट में स्टोर करता है, लेकिन इस डेटा को प्रोग्राम के निष्पादन के दौरान किसी बिंदु पर सहेजने की आवश्यकता होती है और प्रोग्राम को फिर से चलाने पर डिक्शनरी ऑब्जेक्ट में वापस लोड किया जाता है। मैं एक डिक्शनरी ऑब्जेक्ट को एक स्ट्रिंग में कैसे बदलूंगा जिसे एक फाइल में लिखा जा सकता है और एक डिक्शनरी ऑब्जेक्ट में वापस लोड किया जा सकता है? यह उम्मीद है कि शब्दकोशों वाले शब्दकोशों का समर्थन करेगा।

जवाबों:


274

Json मॉड्यूल यहां एक अच्छा समाधान है। अचार के ऊपर यह फायदे हैं कि यह केवल सादा पाठ आउटपुट का उत्पादन करता है, और क्रॉस-प्लेटफॉर्म और क्रॉस-संस्करण है।

import json
json.dumps(dict)

2
मैं इस मॉड्यूल पर एक नज़र डालूंगा। Json और अचार दोनों का उपयोग करना काफी आसान लगता है, इसलिए यह क्रॉस-प्लेटफ़ॉर्म समर्थन जैसी चीज़ों के लिए नीचे आ जाएगा। धन्यवाद
16:00 पर AJ00200

5
अचार को इस बिंदु पर चित्रित किए जाने के बजाय देखा जाता है। मैं हमेशा इस तरह की चीजों के लिए json का उपयोग करता हूं। बीइंग (अपेक्षाकृत) मानव पठनीय समय का एक बड़ा प्लस है।
टायलर इव्स

30
उपयोगकर्ताओं को यह देखने की अनुमति देने के लिए आपको एक सरल उदाहरण जोड़ना चाहिए।
मिगुएल वाज़क

1
@TylerEaves आप उदाहरण प्रदान कर सकते हैं कि यह कैसे किया जाना चाहिए।
बोबन

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

यदि स्रोत अविश्वसनीय है तो अतिरिक्त सुरक्षा के लिए eval के बजाय ast.literal_eval का उपयोग कर सकते हैं ।


13
मैं वास्तव में इस कोड में पेश कर सकने वाले संभावित कारनामों से निपटने के लिए तैयार नहीं हूं। मुझे नहीं पता कि क्या समस्याएँ जौन या अचार की हो सकती हैं, लेकिन मैं एक तथ्य के लिए जानता हूँ कि इस मामले में eval खतरनाक होगा।
AJ00200

5
@ AJ00200: और ast.literal_eval वैकल्पिक मैंने उल्लेख किया है ?. पायथन मदद से: "सुरक्षित रूप से एक अभिव्यक्ति नोड या एक पायथन अभिव्यक्ति युक्त स्ट्रिंग का मूल्यांकन करें। प्रदान की गई स्ट्रिंग या नोड में केवल निम्नलिखित पायथन शाब्दिक संरचनाएं शामिल हो सकती हैं: तार, संख्याएं, टुपल्स, सूचियां, डीकट्स, बूलियन, और कोई नहीं। यह कोई भी नहीं है।" बिना मानों को पार्स करने की आवश्यकता के बिना अविश्वसनीय स्रोतों से पायथन अभिव्यक्तियों वाले तार का सुरक्षित रूप से मूल्यांकन करने के लिए इस्तेमाल किया जा सकता है। "
पाब्लो

यह उपयोगी लगता है, लेकिन जब मैं पहले इस डेटा को संभालने के लिए SQLite का उपयोग कर रहा था और इसकी 1500 से अधिक प्रविष्टियाँ थीं, तो यह काफी बड़ा है और हर समय बढ़ता रहता है।
AJ00200

164

मैं उपयोग करता हूं json:

import json

# convert to string
input = json.dumps({'id': id })

# load to dict
my_dict = json.loads(input) 

14

pickleइसे डिस्क पर सहेजने और बाद में लोड करने के लिए मॉड्यूल का उपयोग करें ।


2
@extraneon वास्तव में, यह सवाल का जवाब है। यह इसे एक स्ट्रिंग में परिवर्तित करता है और इसे एक फ़ाइल में लिखता है। मुझे वास्तविक रूपांतरण या फ़ाइल लेखन करने की आवश्यकता नहीं है क्योंकि यह सभी अचार द्वारा समझाया गया है।
AJ00200

11

अजगर 3 की इनबिल्ट उपयोग करने के लिए नहीं क्यों 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

यदि आप गति के बारे में परवाह करते हैं तो ujson (UltraJSON) का उपयोग करें , जिसमें json के समान API है:

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

मैं इसके लिए yaml का उपयोग करता हूं यदि पठनीय होने की आवश्यकता है (न तो JSON और न ही XML यह IMHO है), या यदि पढ़ना आवश्यक नहीं है तो मैं अचार का उपयोग करता हूं।

लिखो

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'IMHO आवश्यक नहीं है।
गेरार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.