अजगर में json.dump () और json.dumps () के बीच अंतर क्या है?


131

मैंने अजगर में json.dump () और json.dumps () के बीच अंतर खोजने के लिए इस आधिकारिक दस्तावेज़ में खोज की। यह स्पष्ट है कि वे फ़ाइल लेखन विकल्प से संबंधित हैं।
लेकिन उनके बीच क्या अंतर है और किन स्थितियों में किसी को अन्य की तुलना में अधिक लाभ है?

जवाबों:


146

डॉक्स के कहने के अलावा और कुछ जोड़ने के लिए नहीं है। यदि आप JSON को एक फ़ाइल / सॉकेट या जो कुछ भी डंप करना चाहते हैं, तो आपको उसके साथ जाना चाहिए dump()। यदि आपको केवल एक स्ट्रिंग (मुद्रण, पार्सिंग या जो कुछ भी) के लिए इसकी आवश्यकता है तो उपयोग करें dumps()(डंप स्ट्रिंग)

जैसा कि इस उत्तर में एंटी हेपाला ने उल्लेख किया है , ensure_asciiव्यवहार पर कुछ छोटे अंतर हैं। यह ज्यादातर अंतर्निहित write()फ़ंक्शन के काम करने के कारण होता है , क्योंकि यह पूरे स्ट्रिंग के बजाय विखंडू पर काम करता है। उस पर अधिक जानकारी के लिए उसके उत्तर की जाँच करें।

json.dump()

एक JSON प्रारूपित धारा के रूप में fp (.write () - सहायक फ़ाइल जैसी ऑब्जेक्ट के रूप में आबकारी करें

अगर यह सुनिश्चित करें कि गलत है, तो fp को लिखे गए कुछ अंश यूनिकोड उदाहरण हो सकते हैं

json.dumps()

एक JSON स्वरूपित str को सीरीज़ करें

यदि यह सुनिश्चित किया जाए कि गलत है तो परिणाम में ASCII वर्ण हो सकते हैं और वापसी मान एक यूनिकोड उदाहरण हो सकता है


क्या आप सॉकेट के माध्यम से भेजने के लिए डंप () का उपयोग करने के तरीके पर एक उदाहरण दिखा सकते हैं? मुझे पता है कि मैं बाइट्स में बदलने के लिए डंप () और एनकोड () की तुलना में उपयोग कर सकता हूं, लेकिन क्या कोई छोटा रास्ता है?
लड़का


20

मेमोरी उपयोग और गति में।

जब आप jsonstr = json.dumps(mydata)इसे पहली बार कॉल करते हैं तो यह आपके डेटा की पूरी कॉपी मेमोरी में बनाता है और उसके बाद ही आप file.write(jsonstr)इसे डिस्क पर भेजते हैं। तो यह एक तेज़ तरीका है लेकिन अगर आपके पास बचत करने के लिए डेटा का एक बड़ा टुकड़ा है तो यह एक समस्या हो सकती है।

जब आप कॉल करते हैं json.dump(mydata, file)- 's' के बिना, नई मेमोरी का उपयोग नहीं किया जाता है, क्योंकि डेटा को चंक्स द्वारा डंप किया जाता है। लेकिन पूरी प्रक्रिया लगभग 2 गुना धीमी है।

स्रोत: मैंने के सोर्स कोड की जाँच की json.dump()और json.dumps()साथ ही साथ समय को मापने वाले दोनों वेरिएंट का परीक्षण किया time.time()और मेमोरी के उपयोग को htop में देखा।


6

पायथन 2 में एक उल्लेखनीय अंतर यह है कि यदि आप उपयोग कर रहे हैं ensure_ascii=False, dumpतो ठीक से फ़ाइल में UTF-8 एन्कोडेड डेटा लिखेंगे (जब तक कि आप विस्तारित वर्णों के साथ 8-बिट स्ट्रिंग्स का उपयोग नहीं करते हैं जो UTF-8 नहीं हैं):

dumpsदूसरी ओर, के साथ ensure_ascii=Falseएक उत्पादन कर सकते हैं strया unicodeसिर्फ तुम क्या प्रकार आप तार के लिए इस्तेमाल किया पर निर्भर करता है:

इस रूपांतरण तालिका का उपयोग करके JSON स्वरूपित स्ट्रैट के लिए obj को सीरियल करें। यदि यह सुनिश्चित करें कि गलत है, तो परिणाम में गैर-एएससीआईआई अक्षर हो सकते हैं और वापसी मूल्य एक unicodeउदाहरण हो सकता है

(जोर मेरा)। ध्यान दें कि यह अभी भी एक strउदाहरण हो सकता है ।

इस प्रकार आप फ़ाइल को संरचना में सहेजने के लिए इसके रिटर्न मान का उपयोग नहीं कर सकते हैं, बिना यह जांचे कि कौन सा प्रारूप वापस आ गया है और संभवतः साथ खेल रहा है unicode.encode

यह निश्चित रूप से पायथन 3 में वैध चिंता का विषय नहीं है, क्योंकि यह 8-बिट / यूनिकोड भ्रम नहीं है।


के रूप में loadबनामloads , पूरी फाइल को एक JSON दस्तावेज़ loadमानता है , इसलिए आप इसका उपयोग एक एकल फ़ाइल से कई नए सीमित JSON दस्तावेज़ों को पढ़ने के लिए नहीं कर सकते।


अजगर स्ट्रिंग ऑब्जेक्ट में बनाया गया सभी पाठ यूनिकोड है, लेकिन क्या यह सामान्य रूप से मान लेना सुरक्षित है? जब एक फ़ाइल से सामग्री लोड हो रहा है?
जोओ गोनक्लेव्स

@ JoãoGonçalves इसका मतलब है कि आप बाइनरी डेटा को टेक्स्ट के साथ नहीं मिला सकते हैं ताकि अजगर चुपचाप इसे स्वीकार कर ले। जैसे json.dumps([b'123'])-> TypeError
अंती हापाला

@ JoãoGonçalves यह भी ध्यान दें कि JSON दस्तावेजों में तार यूनिकोड के होने चाहिए , और RFC 7159 के अनुसार UTF-8, UTF-16 या UTF-32 में से किसी में होने चाहिए
एंटिटी हवाला

1
उस स्पष्टीकरण के लिए धन्यवाद! समझ में आता है
जोओ गोनक्लेव्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.