这是第一次使用stackoverflow提问。我的英语很差,所以如果我不经意地用言语表达你的意思,请不要介意。
我有一个json文件(access.json),格式如下:
[
{u'IP': u'aaaa1', u'Domain': u'bbbb1', u'Time': u'cccc1', ..... },
{u'IP': u'aaaa2', u'Domain': u'bbbb2', u'Time': u'cccc2', ..... },
{u'IP': u'aaaa3', u'Domain': u'bbbb3', u'Time': u'cccc3', ..... },
{u'IP': u'aaaa4', u'Domain': u'bbbb4', u'Time': u'cccc4', ..... },
{ ....... },
{ ....... }
]
当我使用时:
ipython
import pasdas as pd
data = pd.read_json('./access.json')
它返回:
ValueError: Expected object or value
这就是我想要的结果:
[out]
IP Domain Time ...
0 aaaa1 bbbb1 cccc1 ...
1 aaaa2 bbbb2 cccc2 ...
2 aaaa3 bbbb3 cccc3 ...
3 aaaa4 bbbb4 cccc4 ...
...and so on
我该怎样做才能实现这个目标?谢谢你的答案!
答案 0 :(得分:5)
这不是有效的json,这就是read_json
无法解析它的原因。
{u'IP': u'aaaa1', u'Domain': u'bbbb1', u'Time': u'cccc1', ..... },
应该是
{"IP": "aaaa1", "Domain": "bbbb1", "Time": "cccc1", ..... },
你可以用正则表达式粉碎这个(整个文件)以找到这些,例如:
In [11]: line
Out[11]: "{u'IP': u'aaaa1', u'Domain': u'bbbb1', u'Time': u'cccc1'},"
In [12]: re.sub("(?<=[\{ ,])u'|'(?=[:,\}])", '"', line)
Out[12]: '{"IP": "aaaa1", "Domain": "bbbb1", "Time": "cccc1"},'
注意:这会被某些字符串绊倒,所以请谨慎使用。
更好的解决方案&#34;将确保你在第一时间有有效的json ......看起来这是来自python的str / unicode / repr而不是json.dumps
。
注意:json.dumps
生成有效的json,因此read_json
可以读取。
In [21]: repr({u'IP': u'aaa'})
Out[21]: "{u'IP': u'aaa'}"
In [22]: json.dumps({u'IP': u'aaa'})
Out[22]: '{"IP": "aaa"}'
如果其他人创建了这个&#34; json&#34;,那就抱怨!它不是json。
答案 1 :(得分:4)
它不是JSON格式。这是一个词典列表。您可以使用ast.literal_eval()
从文件中获取实际列表并将其传递给DataFrame
构造函数:
from ast import literal_eval
import pandas as pd
with open('./access.log2.json') as f:
data = literal_eval(f.read())
df = pd.DataFrame(data)
print df
您提供的示例数据的输出:
Domain IP Time
0 bbbb1 aaaa1 cccc1
1 bbbb2 aaaa2 cccc2
2 bbbb3 aaaa3 cccc3
3 bbbb4 aaaa4 cccc4
答案 2 :(得分:0)
您也可以使用
pd.read_json("{json_file_name}", orient='records')
假设JSON数据采用列表格式,如问题所示。