2015-12-25 35 views
5

का उपयोग कर मल्टीलाइन JSON फ़ाइल को पार्सिंग जारी करना मैं पाइथन 2.7 में json लाइब्रेरी का उपयोग कर JSON मल्टीलाइन फ़ाइल को पार्स करने का प्रयास कर रहा हूं। एक सरलीकृत नमूना फ़ाइल नीचे दिया गया है के रूप में इसपाइथन

{ 
"observations": { 
    "notice": [ 
     { 
      "copyright": "Copyright Commonwealth of Australia 2015, Bureau of Meteorology. For more information see: http://www.bom.gov.au/other/copyright.shtml http://www.bom.gov.au/other/disclaimer.shtml", 
      "copyright_url": "http://www.bom.gov.au/other/copyright.shtml", 
      "disclaimer_url": "http://www.bom.gov.au/other/disclaimer.shtml", 
      "feedback_url": "http://www.bom.gov.au/other/feedback" 
     } 
    ] 
} 
} 

मेरे कोड है:

import json 

with open('test.json', 'r') as jsonFile: 
    for jf in jsonFile: 
     jf = jf.replace('\n', '') 
     jf = jf.strip() 
     weatherData = json.loads(jf) 
     print weatherData 

फिर भी, मैं एक त्रुटि के रूप में नीचे दिखाया गया है:

Traceback (most recent call last): 
File "test.py", line 8, in <module> 
weatherData = json.loads(jf) 
File "/home/usr/anaconda2/lib/python2.7/json/__init__.py", line 339, in loads 
return _default_decoder.decode(s) 
File "/home/usr/anaconda2/lib/python2.7/json/decoder.py", line 364, in decode 
obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
File "/home/usr/anaconda2/lib/python2.7/json/decoder.py", line 380, in raw_decode 
obj, end = self.scan_once(s, idx) 
ValueError: Expecting object: line 1 column 1 (char 0) 

बस कुछ परीक्षण करना , मैंने कोड को संशोधित किया है कि नई लाइनों को हटाने और अग्रणी और पिछली सफेद जगहों को दूर करने के बाद, मैं सामग्री को दूसरी फ़ाइल में लिखता हूं (json एक्सटेंशन के साथ)। हैरानी की बात है, जब मैंने बाद की फाइल को वापस पढ़ा, मुझे कोई त्रुटि नहीं मिली और पार्सिंग सफल है।

{u'observations': {u'notice': [{u'copyright_url': u'http://www.bom.gov.au/other/copyright.shtml', u'disclaimer_url': u'http://www.bom.gov.au/other/disclaimer.shtml', u'copyright': u'Copyright Commonwealth of Australia 2015, Bureau of Meteorology. For more information see: http://www.bom.gov.au/other/copyright.shtml http://www.bom.gov.au/other/disclaimer.shtml', u'feedback_url': u'http://www.bom.gov.au/other/feedback'}]}} 

किसी भी विचार क्या हो रहा हो सकता है जब नई लाइनों और सफेद रिक्त स्थान json पुस्तकालय उपयोग करने से पहले हटा दिए जाते हैं:

import json 

filewrite = open('out.json', 'w+') 

with open('test.json', 'r') as jsonFile: 
    for jf in jsonFile: 
     jf = jf.replace('\n', '') 
     jf = jf.strip() 
     filewrite.write(jf) 

filewrite.close() 

with open('out.json', 'r') as newJsonFile: 
    for line in newJsonFile: 
     weatherData = json.loads(line) 
     print weatherData 

उत्पादन इस प्रकार है: संशोधित कोड इस प्रकार है?

उत्तर

4

आप पागल जाना यदि आप लाइन द्वारा एक json फ़ाइल लाइन विभाजित करने की कोशिश करेंगे। जेसन मॉड्यूल में फ़ाइल ऑब्जेक्ट्स को सीधे या स्ट्रिंग्स पढ़ने के लिए सहायक तरीके हैं i.e. load और loads विधियां। load जेसन डेटा युक्त फ़ाइल के लिए एक फ़ाइल ऑब्जेक्ट (नीचे दिखाया गया है) लेता है, जबकि loads एक स्ट्रिंग लेता है जिसमें जेसन डेटा होता है।

विकल्प 1: - पसंदीदा

import json 
with open('test.json', 'r') as jf: 
    weatherData = json.load(jf) 
    print weatherData 

विकल्प 2:

import json 
with open('test.json', 'r') as jf: 
    weatherData = json.loads(jf.read()) 
    print weatherData 

आप उच्च प्रदर्शन JSON को पार्स करने देख रहे हैं की जाँच ujson

+1

धन्यवाद @ ओकेज़ी। 'लोड' के माध्यम से पूरी फाइल लोड हो रही चाल है। – hypersonics

5

पहले स्निपेट में, आप लाइन से लाइन को पार्स करने का प्रयास करते हैं। आपको इसे एक बार में पार्स करना चाहिए। json.load(jsonfile) का उपयोग करना सबसे आसान है। (जेएफ परिवर्तनीय नाम भ्रामक है क्योंकि यह एक स्ट्रिंग है)। तो सही तरीका यह पार्स करने के लिए:

import json 

with open('test.json', 'r') as jsonFile: 
    weatherData = json.loads(jsonFile) 

हालांकि यह एक अच्छा विचार है एक पंक्ति में json स्टोर करने के लिए है, के रूप में यह अधिक संक्षिप्त है।

दूसरा टुकड़ा में आपकी समस्या यह है कि आप यूनिकोड स्ट्रिंग जो और u'string here' अजगर विशिष्ट है के रूप में इसे प्रिंट है। एक मान्य JSON दोहरे उद्धरण चिह्न का उपयोग करता

+0

मैं लोड करने की अपने दृष्टिकोण की कोशिश की पूरी फाइल और एक बार में सभी पार्सिंग, लेकिन यह विफल रहता है। वैसे, मैंने बिना किसी समस्या के लाइन पर जेसन फाइलों को लाइन से पहले पार्स करने की कोशिश की है, उम्मीद है कि प्रत्येक शब्दकोश 100 अक्षरों से अधिक लंबा नहीं होगा। – hypersonics

+0

मेरे लिए यह आपके द्वारा प्रदान किए गए जेसन के साथ ठीक काम कर रहा था।जेसन को पीछे और आगे कनवर्ट करने के लिए सब्लिम JSON प्लगइन का उपयोग करने का प्रयास करें: https://github.com/dzhibas/SublimePrettyJson यह जेसन को भी मान्य करता है, ताकि आप आगे की समस्या की जांच कर सकें। अधिक विस्तृत लिनिंग के लिए http://jsonlint.com/ – fodma1

1

FYI करें, आप एकल with बयान में खोला दोनों फ़ाइलों को हो सकता है:

with open('file_A') as in_, open('file_B', 'w+') as out_: 
    # logic here 
    ... 
+0

प्रयास करें, जबकि यह कोड प्रश्न का उत्तर दे सकता है, यह समझाना बेहतर है कि यह क्या करता है और इसमें कुछ संदर्भ जोड़ें। – dotctor

+1

यह प्रश्न का उत्तर नहीं प्रदान करता है। किसी लेखक से स्पष्टीकरण की आलोचना या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/10682568) –

+0

@ जेम्स: सहमत हुए। जवाब देने के समय मैं प्रश्नों पर टिप्पणी करने में सक्षम नहीं था और अब अपवॉट के लिए धन्यवाद मैं कर सकता हूं :-) –