दिलचस्प पोस्ट
मास्टर शाखा और 'मूल / मास्टर' अलग हो गए हैं, कैसे 'शाखाओं' को अपवर्जित करना है? जावा के System.out में तालिका प्रारूप में आउटपुट @ सिंक्रनाइज़ () क्या करता है? दो डुप्लिकेट को घुमाने के दो प्रेतों की टकराव का पता लगा रहा है stl :: multimap – मैं डेटा के समूह कैसे प्राप्त करूं? java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath () Ljava / lang / String; कैसे चेक किया जाए कि दिए गए सी ++ स्ट्रिंग या चार * केवल अंक हैं? सामान्य URL पर ब्लॉब यूआरएल कन्वर्ट सी ++ में "->" ऑपरेटर क्या है? नाम के साथ FirebaseApp मौजूद नहीं है क्या करता है! फ़ंक्शन ($) {$ (फ़ंक्शन () {})} (window.jQuery) करते हैं? क्या अतिव्यापी NSView भाई बहनों को संभालने का एक उचित तरीका है? User.Identity के उपलब्ध गुणों का विस्तार कैसे करें Itextsharp में ITextExtractionStrategy और LocationTextExtractionStrategy का उपयोग कर स्ट्रिंग के समन्वय प्राप्त करना सी ++ यूनिट परीक्षण ढांचे

मैं एक JSON ऑब्जेक्ट में एक समय में पढ़ने के लिए 'json' मॉड्यूल का उपयोग कैसे करूं?

मेरे पास एक मल्टी-गीगाबाइट JSON फ़ाइल है I फ़ाइल JSON ऑब्जेक्ट्स से बना है जो प्रत्येक कुछ हजार वर्णों से अधिक नहीं है, लेकिन रिकॉर्ड्स के बीच कोई लाइन ब्रेक नहीं है।

अजगर 3 और json मॉड्यूल का उपयोग करने से, मैं एक समय में फ़ाइल में मेमोरी में एक JSON ऑब्जेक्ट कैसे पढ़ सकता हूं?

डेटा एक सादा पाठ फ़ाइल में है। यहां एक समान रिकॉर्ड का एक उदाहरण है। वास्तविक रिकॉर्ड में कई नेस्टेड शब्दकोश और सूचियां शामिल हैं

पठनीय प्रारूप में रिकॉर्ड:

 { "results": { "__metadata": { "type": "DataServiceProviderDemo.Address" }, "Street": "NE 228th", "City": "Sammamish", "State": "WA", "ZipCode": "98074", "Country": "USA" } } } 

वास्तविक स्वरूप नए रिकॉर्ड किसी भी ब्रेक के बिना दूसरे के बाद शुरू करते हैं।

 {"results": { "__metadata": {"type": "DataServiceProviderDemo.Address"},"Street": "NE 228th","City": "Sammamish","State": "WA","ZipCode": "98074","Country": "USA" } } }{"results": { "__metadata": {"type": "DataServiceProviderDemo.Address"},"Street": "NE 228th","City": "Sammamish","State": "WA","ZipCode": "98074","Country": "USA" } } }{"results": { "__metadata": {"type": "DataServiceProviderDemo.Address"},"Street": "NE 228th","City": "Sammamish","State": "WA","ZipCode": "98074","Country": "USA" } } } 

वेब के समाधान से एकत्रित समाधान "मैं एक JSON ऑब्जेक्ट में एक समय में पढ़ने के लिए 'json' मॉड्यूल का उपयोग कैसे करूं?"

आम तौर पर बोलना, एक से अधिक JSON ऑब्जेक्ट को एक फ़ाइल में डालने से यह फ़ाइल अमान्य, टूटी JSON है । उस ने कहा, आप अभी भी JSONDecoder.raw_decode() विधि का उपयोग करते हुए डेटा में डेटा को पार्स कर सकते हैं।

निम्नलिखित वस्तुएं पूरी वस्तुएं प्राप्त करेंगे क्योंकि पार्सर उन्हें पाता है:

 from json import JSONDecoder from functools import partial def json_parse(fileobj, decoder=JSONDecoder(), buffersize=2048): buffer = '' for chunk in iter(partial(fileobj.read, buffersize), ''): buffer += chunk while buffer: try: result, index = decoder.raw_decode(buffer) yield result buffer = buffer[index:] except ValueError: # Not enough data to decode, read more break 

यह फ़ंक्शन बफ़र्स के विखंडू में दिए गए फ़ाइल ऑब्जेक्ट से भाग पढ़ता है, और बफर से decoder ऑब्जेक्ट संपूर्ण JSON ऑब्जेक्ट को पार्स करता है। प्रत्येक पार्स किए गए ऑब्जेक्ट को कॉलर से मिला है।

इसे इस तरह प्रयोग करें:

 with open('yourfilename', 'r') as infh: for data in json_parse(infh): # process object 

इसका प्रयोग केवल तभी करें जब आपके जेएसओएन ऑब्जेक्ट्स फ़ाइल को बैक-टू-बैक में लिखी जाती हैं, इसके बीच में कोई न्यूलाइन नहीं। यदि आपके पास नई लाइनें हैं, और प्रत्येक JSON ऑब्जेक्ट को एक पंक्ति तक सीमित है, तो आपके पास एक JSON लाइन्स दस्तावेज़ है , जिस स्थिति में आप एक JSON फ़ाइल लोड कर सकते हैं और पाइथन में एकाधिक JSON ऑब्जेक्ट्स को पार्स कर सकते हैं।

यदि आपके JSON दस्तावेज़ों में ऑब्जेक्ट्स की एक सूची है, और आप एक-एक-एक-एक-एक ऑब्जेक्ट को पढ़ना चाहते हैं, तो आप जॉब के लिए पुनरावृत्त JSON पार्सर ijson का उपयोग कर सकते हैं। यह केवल फ़ाइल से अधिक सामग्री पढ़ीगा, जब उसे अगले ऑब्जेक्ट को डीकोड करना होगा।

ध्यान दें कि आपको इसे वाईएजएल लाइब्रेरी के साथ उपयोग करना चाहिए, अन्यथा आपको संभवतः कोई भी प्रदर्शन वृद्धि नहीं दिखाई देगी।

कहा जा रहा है, जब तक कि आपकी फ़ाइल सचमुच बड़ी नहीं है , इसे पूरी तरह से स्मृति में पढ़ना और फिर सामान्य जेएसओएन मॉड्यूल के साथ पार्स करने में शायद अभी भी सबसे अच्छा विकल्प होगा

यहां मार्टिजन पीटर के समाधान का एक मामूली बदलाव है, जो कि जेएसएएन तारों को सफेद स्थान से अलग कर देगा।

 def json_parse(fileobj, decoder=json.JSONDecoder(), buffersize=2048, delimiters=None): remainder = '' for chunk in iter(functools.partial(fileobj.read, buffersize), ''): remainder += chunk while remainder: try: stripped = remainder.strip(delimiters) result, index = decoder.raw_decode(stripped) yield result remainder = stripped[index:] except ValueError: # Not enough data to decode, read more break 

उदाहरण के लिए, यदि data.txt में एक स्थान से अलग JSON स्ट्रिंग्स होती हैं:

 {"business_id": "1", "Accepts Credit Cards": true, "Price Range": 1, "type": "food"} {"business_id": "2", "Accepts Credit Cards": true, "Price Range": 2, "type": "cloth"} {"business_id": "3", "Accepts Credit Cards": false, "Price Range": 3, "type": "sports"} 

फिर

 In [47]: list(json_parse(open('data'))) Out[47]: [{u'Accepts Credit Cards': True, u'Price Range': 1, u'business_id': u'1', u'type': u'food'}, {u'Accepts Credit Cards': True, u'Price Range': 2, u'business_id': u'2', u'type': u'cloth'}, {u'Accepts Credit Cards': False, u'Price Range': 3, u'business_id': u'3', u'type': u'sports'}]