簡體   English   中英

在 python 中讀取 json 由換行符分隔

[英]Reading json in python separated by newlines

我正在嘗試使用以下格式閱讀一些 json。 一個簡單的pd.read_json()返回ValueError: Trailing data 添加lines=True返回ValueError: Expected object or value 到目前為止,我已經嘗試了 readlines() 和 load()/loads() 的各種組合,但沒有成功。

有什么想法可以讓我把它變成 dataframe?

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

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

您上面的示例不是有效的 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

如果您不想重新格式化文件,另一種解決方案。 假設您的 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)

感謝互聯網的想法。 沒有人能以我需要的方式完全解決問題(我在字符串本身中有很多換行符,這意味着我無法拆分它們),但它們幫助指明了方向。 如果有人有類似的問題,這對我有用:

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')

如果你可以使用jq那么解決方案更簡單:

jq -s '.' path/to/original.json > path/to/reformatted.json

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM