所以我试图用Python解析一个JSON文件。每次我运行我的脚本时,我都会得到[]
的输出,我对此感到非常困惑。这甚至是在python中解析JSON的正确方法吗?
这是我的代码:
import sys
import simplejson
import difflib
filename = sys.argv[1]
data = []
f = file('output.json', "r")
lines = f.readlines()
for line in lines:
try:
loadLines = simplejson.loads(line)
data.append( loadLines['executionTime'])
except ValueError:
pass
print data
答案 0 :(得分:7)
我最好的猜测是,没有一行是有效的JSON。这将导致每次都抛出ValueError
,并且您将永远不会到达data.append(...)
,因为此时一直抛出异常。
如果整个文件是这样的JSON数组:
[
{
"direction": "left",
"time": 1
},
{
"direction": "right",
"time": 2
}
]
然后你可以简单地使用类似的东西:
with open('output.json', 'r') as f:
data = json.load(f)
但是,如果它是顶层的一堆JSON项,不包含在JSON对象或数组中,如下所示:
{
"direction": "left",
"time": 1
}
{
"direction": "right",
"time": 2
}
然后你将不得不采用不同的方法:逐个解码项目。不幸的是,我们无法流式传输数据,因此我们首先必须立即加载所有数据:
with open('output.json', 'r') as f:
json_data = f.read()
要解析单个项目,我们使用decode_raw
。这意味着我们需要制作JSONDecoder
:
decoder = json.JSONDecoder()
然后我们继续,剥离字符串左侧的任何空格,检查以确保我们仍然有项目,并解析项目:
while json_data.strip(): # while there's still non-whitespace...
# strip off whitespace on the left side of the string
json_data = json_data.lstrip()
# and parse an item, setting the new data to be whatever's left
item, json_data = decoder.parse_raw(json_data)
# ...and then append that item to our list
data.append(item)
如果您正在进行大量此类数据收集,则将其存储在数据库中可能是值得的。像SQLite这样简单的东西就可以了。数据库将使以更有效的方式更容易地进行汇总统计。 (这就是他们的目的!)如果你经常这样做,它可能也会让访问数据变得更快,而不是经常解析JSON。