पायथन json.loads दिखाता है मूल्य: अतिरिक्त डेटा


151

मुझे JSON फ़ाइल "new.json" से कुछ डेटा मिल रहा है, और मैं कुछ डेटा फ़िल्टर करना चाहता हूं और इसे एक नई JSON फ़ाइल में संग्रहीत करना चाहता हूं। यहाँ मेरा कोड है:

import json
with open('new.json') as infile:
    data = json.load(infile)
for item in data:
    iden = item.get["id"]
    a = item.get["a"]
    b = item.get["b"]
    c = item.get["c"]
    if c == 'XYZ' or  "XYZ" in data["text"]:
        filename = 'abc.json'
    try:
        outfile = open(filename,'ab')
    except:
        outfile = open(filename,'wb')
    obj_json={}
    obj_json["ID"] = iden
    obj_json["VAL_A"] = a
    obj_json["VAL_B"] = b

और मुझे एक त्रुटि मिल रही है, ट्रेसबैक है:

  File "rtfav.py", line 3, in <module>
    data = json.load(infile)
  File "/usr/lib64/python2.7/json/__init__.py", line 278, in load
    **kw)
  File "/usr/lib64/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/lib64/python2.7/json/decoder.py", line 369, in decode
    raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 88 column 2 - line 50607 column 2 (char 3077 - 1868399)

क्या कोई मेरी मदत कर सकता है?

यहाँ new.json में डेटा का एक नमूना है, फ़ाइल में लगभग 1500 अधिक ऐसे शब्दकोश हैं

{
    "contributors": null, 
    "truncated": false, 
    "text": "@HomeShop18 #DreamJob to professional rafter", 
    "in_reply_to_status_id": null, 
    "id": 421584490452893696, 
    "favorite_count": 0, 
    "source": "<a href=\"https://mobile.twitter.com\" rel=\"nofollow\">Mobile Web (M2)</a>", 
    "retweeted": false, 
    "coordinates": null, 
    "entities": {
        "symbols": [], 
        "user_mentions": [
            {
                "id": 183093247, 
                "indices": [
                    0, 
                    11
                ], 
                "id_str": "183093247", 
                "screen_name": "HomeShop18", 
                "name": "HomeShop18"
            }
        ], 
        "hashtags": [
            {
                "indices": [
                    12, 
                    21
                ], 
                "text": "DreamJob"
            }
        ], 
        "urls": []
    }, 
    "in_reply_to_screen_name": "HomeShop18", 
    "id_str": "421584490452893696", 
    "retweet_count": 0, 
    "in_reply_to_user_id": 183093247, 
    "favorited": false, 
    "user": {
        "follow_request_sent": null, 
        "profile_use_background_image": true, 
        "default_profile_image": false, 
        "id": 2254546045, 
        "verified": false, 
        "profile_image_url_https": "https://pbs.twimg.com/profile_images/413952088880594944/rcdr59OY_normal.jpeg", 
        "profile_sidebar_fill_color": "171106", 
        "profile_text_color": "8A7302", 
        "followers_count": 87, 
        "profile_sidebar_border_color": "BCB302", 
        "id_str": "2254546045", 
        "profile_background_color": "0F0A02", 
        "listed_count": 1, 
        "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", 
        "utc_offset": null, 
        "statuses_count": 9793, 
        "description": "Rafter. Rafting is what I do. Me aur mera Tablet.  Technocrat of Future", 
        "friends_count": 231, 
        "location": "", 
        "profile_link_color": "473623", 
        "profile_image_url": "http://pbs.twimg.com/profile_images/413952088880594944/rcdr59OY_normal.jpeg", 
        "following": null, 
        "geo_enabled": false, 
        "profile_banner_url": "https://pbs.twimg.com/profile_banners/2254546045/1388065343", 
        "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", 
        "name": "Jayy", 
        "lang": "en", 
        "profile_background_tile": false, 
        "favourites_count": 41, 
        "screen_name": "JzayyPsingh", 
        "notifications": null, 
        "url": null, 
        "created_at": "Fri Dec 20 05:46:00 +0000 2013", 
        "contributors_enabled": false, 
        "time_zone": null, 
        "protected": false, 
        "default_profile": false, 
        "is_translator": false
    }, 
    "geo": null, 
    "in_reply_to_user_id_str": "183093247", 
    "lang": "en", 
    "created_at": "Fri Jan 10 10:09:09 +0000 2014", 
    "filter_level": "medium", 
    "in_reply_to_status_id_str": null, 
    "place": null
} 

जब भी इनपुट JSON के पास प्रति पंक्ति एक से अधिक ऑब्जेक्ट है, तो यह त्रुटि है। यहाँ उत्तर में से कई मान लेते हैं कि प्रति पंक्ति में केवल एक ही वस्तु है, या उदाहरणों का पालन करते हुए निर्माण करें, लेकिन अगर ऐसा नहीं होता तो वे टूट जाते।
स्माइली

@ हिसकी: क्या आप पंक्ति को समझा सकते हैंmore than one object per line
आकांक्षा 1

जवाबों:


150

जैसा कि आप निम्नलिखित उदाहरण में देख सकते हैं, json.loads(और json.load) कई जोंस ऑब्जेक्ट को डिकोड नहीं करता है।

>>> json.loads('{}')
{}
>>> json.loads('{}{}') # == json.loads(json.dumps({}) + json.dumps({}))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\json\__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "C:\Python27\lib\json\decoder.py", line 368, in decode
    raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 1 column 3 - line 1 column 5 (char 2 - 4)

यदि आप कई शब्दकोशों को डंप करना चाहते हैं, तो उन्हें सूची में लपेटें, सूची को डंप करें (कई बार शब्दकोशों को डंप करने के बजाय)

>>> dict1 = {}
>>> dict2 = {}
>>> json.dumps([dict1, dict2])
'[{}, {}]'
>>> json.loads(json.dumps([dict1, dict2]))
[{}, {}]

7
क्या आप कृपया ऊपर दिए गए कोड के संदर्भ में फिर से बता सकते हैं? मैं नौसिखिया हूं, और कई बार ऐसी चीजों को समझने में लंबा समय लेता हूं।
अपूर्व आशुतोष ११'१४

1
@ApoorvAshutosh, ऐसा लगता है जैसे new.jsonइसमें एक json और दूसरा अनावश्यक डेटा हो। json.load, json.loadsकेवल एक डेसोडन को डिकोड कर सकता है। यह एक उठाना ValueErrorजब यह addtional डेटा मुठभेड़ जैसा कि आप देख।
falsetru

New.json से एक नमूना चिपकाया है, और मैं इसमें से कुछ डेटा को फ़िल्टर कर रहा हूं, इसलिए मुझे वह नहीं मिलता है जहां से मुझे अतिरिक्त डेटा मिल रहा है
अपूर्व आशुतोष

1
@ApoorvAshutosh, आपने संपादित प्रश्न में ऐसे 1500 और शब्दकोश दिए हैं। वह अतिरिक्त डेटा है। यदि आप वह हैं, जिसने एक बनाया है new.json, तो बस एक फ़ाइल में एक ही json डालें।
falsetru

1
@ApoorvAshutosh, यदि आपको कई शब्दकोशों को जन्स के रूप में डंप करने की आवश्यकता है, तो उन्हें सूची में लपेटें और सूची को डंप करें।
falsetru

100

आप बस एक फ़ाइल से पढ़ सकते हैं, jsonifyingप्रत्येक पंक्ति जो आप जाते हैं:

tweets = []
for line in open('tweets.json', 'r'):
    tweets.append(json.loads(line))

यह मध्यवर्ती अजगर वस्तुओं के भंडारण से बचा जाता है। जब तक आपका append()कॉल प्रति एक पूर्ण ट्वीट लिखें , तब तक यह काम करना चाहिए।


7
यदि आप निर्यात की प्रक्रिया को नियंत्रित करते हैं, तो समस्या के स्रोत को ठीक करने के तरीके को स्वीकार किए गए उत्तर का पता है, लेकिन अगर आप किसी और के डेटा का उपयोग कर रहे हैं और आपको बस इससे निपटना है, तो यह एक महान लो-ओवरहेड विधि है।
charlesreid1

3
कई डेटासेट (उदाहरण: येल्प डेटासेट) आजकल Json ऑब्जेक्ट्स के "सेट" के रूप में दिए गए हैं और आपका दृष्टिकोण उन्हें लोड करने के लिए सुविधाजनक है।
गबर

36

मैं इस पार आया क्योंकि मैं एक JSON फ़ाइल MongoDB से डंप लोड करने की कोशिश कर रहा था। यह मुझे एक त्रुटि दे रहा था

JSONDecodeError: Extra data: line 2 column 1

MongoDB JSON डंप में प्रति पंक्ति एक ऑब्जेक्ट है, इसलिए मेरे लिए जो काम किया गया है वह है:

import json
data = [json.loads(line) for line in open('data.json', 'r')]

13

यह तब भी हो सकता है जब आपकी JSON फाइल सिर्फ 1 JSON रिकॉर्ड न हो। एक JSON रिकॉर्ड इस तरह दिखता है:

[{"some data": value, "next key": "another value"}]

यह ब्रैकेट के साथ खुलता है और बंद होता है [], कोष्ठक के भीतर ब्रेसिज़ {} हैं। ब्रेसिज़ के कई जोड़े हो सकते हैं, लेकिन यह सभी एक करीबी ब्रैकेट के साथ समाप्त होता है]। यदि आपकी json फ़ाइल में से एक से अधिक है:

[{"some data": value, "next key": "another value"}]
[{"2nd record data": value, "2nd record key": "another value"}]

फिर लोड () विफल हो जाएगा।

मैंने इसे अपनी फ़ाइल के साथ सत्यापित किया जो विफल रही थी।

import json

guestFile = open("1_guests.json",'r')
guestData = guestFile.read()
guestFile.close()
gdfJson = json.loads(guestData)

यह काम करता है क्योंकि 1_guests.json का एक रिकॉर्ड [] है। मूल फ़ाइल जो मैं all_guests.json का उपयोग कर रहा था, उसमें 6 रिकॉर्ड्स को नईलाइन द्वारा अलग कर दिया गया था। मैंने 5 रिकॉर्ड हटा दिए, (जो मैंने पहले से ही ब्रैकेट द्वारा बुक किए जाने की जाँच की थी) और फ़ाइल को एक नए नाम से सहेजा था। फिर लोड स्टेटमेंट ने काम किया।

त्रुटि थी

   raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 2 column 1 - line 10 column 1 (char 261900 - 6964758)

पुनश्च। मैं शब्द रिकॉर्ड का उपयोग करता हूं, लेकिन यह आधिकारिक नाम नहीं है। साथ ही, यदि आपकी फ़ाइल में मेरी जैसी न्यूलाइन वर्ण हैं, तो आप इसे लोड कर सकते हैं () एक बार में एक जसन चर में रिकॉर्ड कर सकते हैं।


2
क्या json.loadsन्यूलाइन-सीमांकित जोंस चंक्स पढ़ने के लिए एक तरीका है ? अर्थात्, जैसा कार्य करना है [json.loads(x) for x in text.split('\n')]? संबंधित: क्या कोई गारंटी है कि json.dumpsडिफ़ॉल्ट इंडेंटिंग के साथ इसके आउटपुट में शाब्दिक नए समाचार शामिल नहीं होंगे?
बेन

1
@, डिफ़ॉल्ट रूप json.dumpsसे "\n", टेक्स्ट कंटेंट में नए लिंक को बदल देगा , आपके जसन को एक लाइन में रखेगा ।
jchook

7

खैर, यह किसी की मदद कर सकता है। मैं सिर्फ एक ही त्रुटि है, जबकि मेरी json फ़ाइल इस तरह है

{"id":"1101010","city_id":"1101","name":"TEUPAH SELATAN"}
{"id":"1101020","city_id":"1101","name":"SIMEULUE TIMUR"}

और मैंने इसे विकृत पाया, इसलिए मैंने इसे कुछ लोगों के जीवन में बदल दिया

{
  "datas":[
    {"id":"1101010","city_id":"1101","name":"TEUPAH SELATAN"},
    {"id":"1101020","city_id":"1101","name":"SIMEULUE TIMUR"}
  ]
}

1
लोडिंग आपकी तरह, json.load (शिशु)
अकबर नोटो

6

आपकी समस्या के लिए वन-लाइनर:

data = [json.loads(line) for line in open('tweets.json', 'r')]

1
यह एक सामान्य समाधान नहीं है, यह मानता है कि इनपुट में प्रति पंक्ति एक JSON ऑब्जेक्ट है, और इसे नहीं तोड़ता है।
एसएमसीआई

3

यदि आप इसे दो-लाइनर में हल करना चाहते हैं तो आप इसे इस तरह से कर सकते हैं:

with open('data.json') as f:
    data = [json.loads(line) for line in f]

1

मुझे लगता है कि एक सूची में dicts को बचाना @falsetru द्वारा प्रस्तावित एक आदर्श समाधान नहीं है।

बेहतर तरीका है, dicts के माध्यम से पुनरावृत्ति करना और उन्हें एक नई लाइन जोड़कर .json में सहेजना।

हमारे 2 शब्दकोश हैं

d1 = {'a':1}

d2 = {'b':2}

आप उन्हें लिख सकते हैं .json

import json
with open('sample.json','a') as sample:
    for dict in [d1,d2]:
        sample.write('{}\n'.format(json.dumps(dict)))

और आप किसी भी मुद्दे के बिना json फ़ाइल पढ़ सकते हैं

with open('sample.json','r') as sample:
    for line in sample:
        line = json.loads(line.strip())

सरल और कुशल


यह एक सामान्य समाधान नहीं है, यह मानता है कि इनपुट में प्रति पंक्ति एक JSON ऑब्जेक्ट है, और इसे नहीं तोड़ता है।
एसएमसीआई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.