【问题标题】:Reading json in python separated by newlines在python中读取由换行符分隔的json
【发布时间】:2019-11-15 15:57:37
【问题描述】:

我正在尝试使用以下格式读取一些 json。一个简单的pd.read_json() 返回ValueError: Trailing data。添加lines=True 将返回ValueError: Expected object or value。到目前为止,我已经尝试了 readlines() 和 load()/loads() 的各种组合,但没有成功。

有什么想法可以将其放入数据框吗?

{
    "content": "kdjfsfkjlffsdkj",
    "source": {
        "name": "jfkldsjf"
    },
    "title": "dsldkjfslj",
    "url": "vkljfklgjkdlgj"
}

{
    "content": "djlskgfdklgjkfgj",
    "source": {
        "name": "ldfjkdfjs"
    },
    "title": "lfsjdfklfldsjf",
    "url": "lkjlfggdflkjgdlf"
}

【问题讨论】:

  • 如何使用双换行符作为分隔符进行拆分,然后将您的 JSON 转换为字典列表?然后你可以简单地使用df = pd.DataFrame(my_list_of_dict)
  • 打开文件,在文件开头添加[,在末尾添加]。然后通过确保字典以逗号分隔。 (请参阅下面的答案。)

标签: python json python-3.x pandas


【解决方案1】:

您上面的示例不是有效的 JSON。要成为有效的 JSON,这些对象需要位于 JS 数组 ([]) 中并用逗号分隔,如下所示:

[{
    "content": "kdjfsfkjlffsdkj",
    "source": {
        "name": "jfkldsjf"
    },
    "title": "dsldkjfslj",
    "url": "vkljfklgjkdlgj"
},

{
    "content": "djlskgfdklgjkfgj",
    "source": {
        "name": "ldfjkdfjs"
    },
    "title": "lfsjdfklfldsjf",
    "url": "lkjlfggdflkjgdlf"
}]

我刚刚在我的机器上试过。格式正确时,它可以工作

>>> pd.read_json('data.json')
            content                 source           title               url
0   kdjfsfkjlffsdkj   {'name': 'jfkldsjf'}      dsldkjfslj    vkljfklgjkdlgj
1  djlskgfdklgjkfgj  {'name': 'ldfjkdfjs'}  lfsjdfklfldsjf  lkjlfggdflkjgdlf

【讨论】:

  • 太棒了,谢谢!你能分享一下你是如何重新格式化它的吗?
【解决方案2】:

如果您不想重新格式化文件,另一种解决方案。 假设您的 JSON 在一个名为 my_json 的字符串中,您可以这样做:

import json
import pandas as pd

splitted = my_json.split('\n\n')
my_list = [json.loads(e) for e in splitted]
df = pd.DataFrame(my_list)

【讨论】:

    【解决方案3】:

    感谢互联网的想法。没有一个能以我需要的方式完全解决问题(我在字符串本身中有很多换行符,这意味着我无法拆分它们),但它们帮助指明了方向。如果有人有类似的问题,这对我有用:

    with open('path/to/original.json', 'r') as f:
        data = f.read()  
        data = data.split("}\n")
        data = [d.strip() + "}" for d in data]
        data = list(filter(("}").__ne__, data))
        data = [json.loads(d) for d in data]
    
    with open('path/to/reformatted.json', 'w') as f:
        json.dump(data, f)
    
    df = pd.read_json('path/to/reformatted.json')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 2021-12-07
      • 2021-03-22
      相关资源
      最近更新 更多