[英]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.