【问题标题】:How do I to translate this json format into correct format that can be used pandas read_json()如何将此 json 格式转换为可用于 pandas read_json() 的正确格式
【发布时间】:2014-07-29 13:47:11
【问题描述】:

这是第一次使用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

我应该怎么做才能实现这个目标?谢谢你的答案!

【问题讨论】:

  • 这不是一个有效的 json 文件(字符串应该用双引号括起来,而不是单用 u 开头)。您正在生成这个“json”文件吗?
  • 致 @Andy Hayden,是的,我通过某人的例子生成了这个文件。(现在我知道这是错误的。)你能教我如何使用 pandas read_json() 格式吗?我试过这个 [{"IP":"aaaa" ,"Domain":"bbb" ....},{...}...]

标签: python json pandas


【解决方案1】:

这不是有效的 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。

【讨论】:

    【解决方案2】:

    它不是 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
    

    【讨论】:

    • 感谢您的回答!我尝试这种方式,它返回给我的消息'被杀死'。
    • 如果我有很多数据,还有其他方法可以完成这项工作吗?
    【解决方案3】:

    你也可以使用

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

    假设 JSON 数据为列表格式,如问题所示。

    【讨论】:

      猜你喜欢
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      相关资源
      最近更新 更多