如何将此json格式转换为可供pandas read_json()使用的正确格式?

6 投票
3 回答
4699 浏览
提问于 2025-04-18 09:05

这是我第一次在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

我该怎么做才能达到这个目标呢?谢谢你的回答!

3 个回答

0

你也可以使用

pd.read_json("{json_file_name}", orient='records')

前提是你的JSON数据是列表格式,就像问题中展示的那样。

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
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"},'

注意:这可能会被某些字符串搞混,所以要小心使用。

一个更好的“解决方案”是确保你一开始就有有效的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"}'

如果别人创建了这个“json”,那就抱怨吧!这根本不是json。

撰写回答