2014-01-11 166 views
61

我從一個JSON文件「new.json」獲取一些數據,我想過濾一些數據並將其存儲到一個新的JSON文件中。這裏是我的代碼:Python的json.loads顯示ValueError:額外的數據

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的數據的樣品中,有該文件

{ 
    "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 
} 
+1

將你的new.json內容粘貼出 –

+1

@ Bob.Z,完成之後 –

回答

75

正如你可以在下面的例子中看到在約1500多個這樣的字典,json.loads(和json.load)不解碼多個json對象。

>>> 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])) 
[{}, {}] 
+3

請參考我上面給出的代碼重新解釋一下嗎?我是一名新手,有時需要很長時間來掌握這些東西。 –

+0

@ApoorvAshutosh,它看起來像'新。json'包含一個json和另一個冗餘數據。 'json.load',''json.loads'只能解碼一個json。它會在遇到附加數據時引發'ValueError',就像你看到的那樣。 – falsetru

+0

已經從new.json粘貼了一個樣本,我從中篩選出一些數據,所以我沒有從 –

31

可我只是建議你不必將所有推文打包成列表,然後做json.dumps。你可以隨時寫入文件,然後加載它們:

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

這樣你就不必存儲中間的python對象。只要你寫每一個寫電話一個完整的鳴叫這應該工作。

+3

如果您控制導出過程,接受的答案將解決如何解決問題的根源,但如果您使用的是其他人的數據,而您只需要處理它,則這是一個很好的低開銷方法。 – charlesreid1

+0

現在許多數據集(例如:Yelp數據集)都是作爲Json對象的「集合」提供的,並且您的方法可以方便地加載它們。 – Gabrer

8

如果您的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) 

PS。我用記錄這個詞,但這不是正式的名字。另外,如果你的文件有像我這樣的換行符,你可以通過循環來一次加載()一條記錄到一個json變量中。

+2

有沒有辦法讓'json.loads'讀取換行符分隔的json塊?也就是說,像'[json.loads(x)for text.split('\ n')]'? 相關:有沒有保證'json.dumps'不會在默認縮進的輸出中包含文字換行符? – Ben

+1

@Ben,默認情況下'json.dumps'會將文本內容的換行符改爲'「\ n」',將json保留爲一行。 – jchook