我有一个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
}
该文件中包含近1500个这样的词典。我想知道在python中是否有任何预先存在的解析器用于这样的文件,用于延迟解析。我希望解析器一次只返回一个字典,或者最坏的情况是,逐行返回。我该怎么办?
答案 0 :(得分:3)
以下是使用json.JSONDecoder.raw_decode的解决方法功能。我希望有人建议一个更好的方法来处理这个问题。
import json
import re
nonspace = re.compile(r'\S')
def iterparse(j):
decoder = json.JSONDecoder()
pos = 0
while True:
matched = nonspace.search(j, pos)
if not matched:
break
pos = matched.start()
decoded, pos = decoder.raw_decode(j, pos)
yield decoded
使用示例:
>>> j = '''
... { "id": 1 }
... { "id": 2 }
... '''
>>> list(iterparse(j))
[{u'id': 1}, {u'id': 2}]
答案 1 :(得分:2)
您可以使用raw_decode
中的json.JSONDecoder
进行操作,而无需将整个文件读入内存:
raw_decode(S) 从s解码JSON文档(以JSON文档开头的str)并返回Python表示的2元组和文档结束的s中的索引。
这可用于从最后可能包含无关数据的字符串中解码JSON文档。
import json
def iterparse(file_obj):
decoder = json.JSONDecoder()
buf = ""
for line in file_obj:
buf += line.strip()
try:
res = decoder.raw_decode(buf)
buf = ""
yield res[0]
except ValueError:
pass
with open("stuff.json") as f:
for obj in iterparse(f):
print obj
答案 2 :(得分:0)
尝试ijson解析器:
使用示例:
import ijson
parser = ijson.parse(urlopen('url/'))
stream.write('<geo>')
for prefix, event, value in parser:
if (prefix, event) == ('earth', 'map_key'):
stream.write('<%s>' % value)
continent = value
elif prefix.endswith('.name'):
stream.write('<object name="%s"/>' % value)
elif (prefix, event) == ('earth.%s' % continent, 'end_map'):
stream.write('</%s>' % continent)
stream.write('</geo>')