পাইথন json.loads মান মান দেখায়: অতিরিক্ত ডেটা


151

আমি একটি JSON ফাইল "new.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)

কেউ আমাকে সাহায্য করতে পারেন?

এখানে নতুন.জসনে ডেটাগুলির একটি নমুনা দেওয়া হয়েছে, ফাইলে আরও প্রায় 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 এর প্রতি লাইনে একাধিক অবজেক্ট থাকে তখনই আপনি এই ত্রুটিটি পান। এখানে বেশিরভাগ উত্তর ধরে নিয়েছে যে প্রতি লাইন প্রতি মাত্র একটি অবজেক্ট রয়েছে, বা এটি মানার উদাহরণ তৈরি করে তবে তা যদি না ঘটে তবে ভেঙে ফেলা হবে।
স্মৃতি

@smci: আপনি লাইন ব্যাখ্যা করতে পারবেনmore than one object per line
aspiring1

উত্তর:


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
@ অপুরভ আশুতোষ, দেখে মনে হচ্ছে new.jsonএটিতে একটি জসন এবং অন্য একটি রিলন্ড্যান্ট ডেটা রয়েছে। json.load, json.loadsকেবল একটি জসনকে ডিকোড করতে পারে। ValueErrorআপনি যখনই দেখেন এটি অ্যাডিশনাল ডেটার মুখোমুখি হয় তখন এটি উত্থাপন করে ।
ফলসেট্রু

New.json থেকে একটি নমুনা আটকানো হয়েছে এবং আমি এ থেকে কিছু তথ্য ফিল্টার করছি, তাই আমি কোথা থেকে অতিরিক্ত তথ্য পাচ্ছি তা পাই না
অপুরভ আশুতোষ

1
@ অপুরভ আশুতোষ, আপনি সম্পাদিত প্রশ্নে এরকম আরও 1500 অভিধান বলেছিলেন । এটি অতিরিক্ত তথ্য। যদি আপনি সেই একজন হন তবে new.jsonকেবল একটি ফাইলে একটি সিঙ্গেল জসন রাখুন।
ফলসেট্রু

1
@ অপুরভ আশুতোষ, আপনার যদি একাধিক অভিধান জসন হিসাবে ডাম্প করতে হয় তবে সেগুলিকে একটি তালিকায় মুড়ে রাখুন এবং তালিকাটি ডাম্প করুন।
ফলসেট্রু

100

আপনি jsonifyingপ্রতিটি ফাইলের কাছ থেকে কেবল প্রতিটি ফাইলই পড়তে পারেন:

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

এটি মধ্যবর্তী পাইথন অবজেক্টগুলি সঞ্চয় করা এড়িয়ে চলে। যতক্ষণ আপনার লেখার প্রতি append()কল প্রতি একটি সম্পূর্ণ টুইট থাকবে , এটি কাজ করা উচিত।


7
গৃহীত উত্তরটি যদি আপনি রফতানির প্রক্রিয়াটি নিয়ন্ত্রণ করেন তবে কীভাবে সমস্যার উত্স ঠিক করতে হবে তা সম্বোধন করে, তবে আপনি যদি অন্য কারও ডেটা ব্যবহার করছেন এবং আপনাকে কেবল এটির মোকাবিলা করতে হবে তবে এটি একটি দুর্দান্ত লো-ওভারহেড পদ্ধতি।
Charlesreid1

3
আজকাল অনেকগুলি ডেটাসেট (যেমন: ইয়েল্প ডেটাসেট) জসন বস্তুর "সেট" হিসাবে সরবরাহ করা হয় এবং আপনার পদ্ধতির এগুলি লোড করা সুবিধাজনক।
গ্যাবরে

36

আমি এটি পেরেছি কারণ আমি মঙ্গোডিবি থেকে ফেলে দেওয়া একটি জেএসএন ফাইল লোড করার চেষ্টা করছিলাম। এটি আমাকে একটি ত্রুটি দিচ্ছিল

JSONDecodeError: Extra data: line 2 column 1

মংগোডিবি জেএসওএন ডাম্পের প্রতি লাইনে একটি অবজেক্ট রয়েছে, সুতরাং আমার জন্য যা কাজ করা তা হ'ল:

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

13

আপনার JSON ফাইলটি কেবল 1 জেএসএন রেকর্ড না হলে এটিও ঘটতে পারে। একটি জেএসওএন রেকর্ডটি দেখতে এমন দেখাচ্ছে:

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

এটি বন্ধনী সহ খোলে এবং বন্ধ হয় [], বন্ধনীগুলির মধ্যে বন্ধনীগুলি {}} ধনুর্বন্ধনী বহু জোড়া থাকতে পারে, তবে এটি একটি বন্ধনী বন্ধনী দিয়ে শেষ হয়]। যদি আপনার জসন ফাইলে এর মধ্যে একটিরও বেশি থাকে:

[{"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_ অতিথি.জসনের একটি রেকর্ড রয়েছে []। মূল ফাইলটি আমি all_g অতিথি ব্যবহার করছি was জসনের নিউলাইন দ্বারা by টি রেকর্ড আলাদা ছিল। আমি 5 টি রেকর্ড মুছে ফেলেছি, (যা আমি ইতিমধ্যে বন্ধনী দ্বারা উত্সাহিত হতে চেক করেছি) এবং একটি নতুন নামে ফাইলটি সংরক্ষণ করেছি। তারপরে লোড স্টেটমেন্টটি কাজ করেছিল।

ত্রুটি ছিল

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

পুনশ্চ. আমি শব্দটি রেকর্ড ব্যবহার করি, তবে এটি অফিশিয়াল নাম নয়। এছাড়াও, যদি আপনার ফাইলে আমার মতো নতুন লাইন অক্ষর থাকে তবে আপনি এটির মাধ্যমে লুপ করতে পারেন () একবারে একটি রেকর্ডকে জেসন ভেরিয়েবলে into


2
json.loadsনিউলাইন-সীমাবদ্ধ জসন খণ্ডগুলি পড়ার কী উপায় আছে ? অর্থাত্, অভিনয় করার মতো [json.loads(x) for x in text.split('\n')]? সম্পর্কিত: এমন কোনও গ্যারান্টি রয়েছে যা json.dumpsএর আউটপুটে ডিফল্ট ইনডেন্টিং সহ আক্ষরিক নতুনলাইনগুলি অন্তর্ভুক্ত করবে না?
বেন

1
@ বেন, ডিফল্টরূপে আপনার জসনকে একটি লাইনে রেখে json.dumpsপাঠ্য সামগ্রীতে নতুন লাইনগুলি পরিবর্তন করবে "\n"
jchook

7

ঠিক আছে, এটি কারও সাহায্য করতে পারে। আমার জাসন ফাইলটি এরকম অবস্থায় আমি ঠিক একই ত্রুটি পেয়েছি

{"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 (infile)
আকবর নোটো

6

আপনার সমস্যার জন্য ওয়ান-লাইনার:

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

1
এটি কোনও সাধারণ সমাধান নয়, এটি ধরে নেয় যে ইনপুটটিতে প্রতি লাইনে একটি জেএসওএন অবজেক্ট রয়েছে এবং এটি এটি ভেঙে দেয়।
স্মি

3

আপনি যদি এটি একটি দ্বি-লাইনারে সমাধান করতে চান তবে আপনি এটি এটি করতে পারেন:

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

1

আমি মনে করি একটি তালিকায় ডিকট সংরক্ষণ করা @Falsetru দ্বারা প্রস্তাবিত আদর্শ সমাধান নয়।

আরও ভাল উপায় হ'ল ডিক্টের মাধ্যমে পুনরাবৃত্তি করা এবং একটি নতুন লাইন যুক্ত করে .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())

সহজ এবং দক্ষ


এটি কোনও সাধারণ সমাধান নয়, এটি ধরে নেয় যে ইনপুটটিতে প্রতি লাইনে একটি জেএসওএন অবজেক্ট রয়েছে এবং এটি এটি ভেঙে দেয়।
স্মি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.