如何在python(pandas)中将嵌套JSON格式的特定部分解析为csv
我有一个嵌套的JSON文件,我无法将其解析为扁平csv。 我希望csv中包含以下列: id、名称、路径、标记(每个标记对应一列)、点(我需要4个点的x\y值) JSON输入的示例:如何在python(pandas)中将嵌套JSON格式的特定部分解析为csv,python,json,csv,parsing,Python,Json,Csv,Parsing,我有一个嵌套的JSON文件,我无法将其解析为扁平csv。 我希望csv中包含以下列: id、名称、路径、标记(每个标记对应一列)、点(我需要4个点的x\y值) JSON输入的示例: { "name": "test", "securityToken": "test Token", "videoSettings": { "frameExtractionRate": 15 }, "tags": [ { "name": "Blur Reject", "co
{
"name": "test",
"securityToken": "test Token",
"videoSettings": {
"frameExtractionRate": 15
},
"tags": [
{
"name": "Blur Reject",
"color": "#FF0000"
},
{
"name": "Blur Poor",
"color": "#800000"
}
],
"id": "Du1qtrZQ1",
"activeLearningSettings": {
"autoDetect": false,
"predictTag": true,
"modelPathType": "coco"
},
"version": "2.1.0",
"lastVisitedAssetId": "ddee3e694ec299432fed9e42de8741ad",
"assets": {
"0b8f6f214dc7066b00b50ae16cf25cf6": {
"asset": {
"format": "jpg",
"id": "0b8f6f214dc7066b00b50ae16cf25cf6",
"name": "1.jpg",
"path": "c:\temp\1.jpg",
"size": {
"width": 1500,
"height": 1125
},
"state": 2,
"type": 1
},
"regions": [
{
"id": "VtDyR9Ovl",
"type": "POLYGON",
"tags": [
"3",
"9",
"Dark Poor"
],
"boundingBox": {
"height": 695.2110389610389,
"width": 1111.607142857143,
"left": 167.41071428571428,
"top": 241.07142857142856
},
"points": [
{
"x": 167.41071428571428,
"y": 252.02922077922076
},
{
"x": 208.80681818181816,
"y": 891.2337662337662
},
{
"x": 1252.232142857143,
"y": 936.2824675324675
},
{
"x": 1279.017857142857,
"y": 241.07142857142856
}
]
}
],
"version": "2.1.0"
},
"0155d8143c8cad85b5b9d392fd2895a4": {
"asset": {
"format": "jpg",
"id": "0155d8143c8cad85b5b9d392fd2895a4",
"name": "2.jpg",
"path": "c:\temp\2.jpg",
"size": {
"width": 1080,
"height": 1920
},
"state": 2,
"type": 1
},
"regions": [
{
"id": "7FFl_diM2",
"type": "POLYGON",
"tags": [
"Dark Poor"
],
"boundingBox": {
"height": 502.85714285714283,
"width": 820.3846153846155,
"left": 144.08653846153848,
"top": 299.2207792207792
},
"points": [
{
"x": 152.39423076923077,
"y": 311.68831168831167
},
{
"x": 144.08653846153848,
"y": 802.077922077922
},
{
"x": 964.4711538461539,
"y": 781.2987012987012
},
{
"x": 935.3942307692308,
"y": 299.2207792207792
}
]
}
],
"version": "2.1.0"
}
}
我尝试使用pandas的json_normalize,并意识到我不完全理解如何指定我希望解析的列:
import json
import csv
import pandas as pd
from pandas import Series, DataFrame
from pandas.io.json import json_normalize
f = open(r'c:\temp\test-export.json')
data = json.load(f) # load as json
f.close()
df = json_normalize(data) #load json into dataframe
df.to_csv(r'c:\temp\json-to-csv.csv', sep=',', encoding='utf-8')
结果很难处理,因为我没有指定我想要的内容(I通过特定的数组插入并将其附加到CSV)
这是我希望你帮助的地方
我假设我不完全理解规范化是如何工作的,并且怀疑它不是处理这个问题的最佳方法
谢谢大家! 你可以这样做。因为您没有提供示例输出,所以我自己做了一些事情
import json
import csv
f = open(r'file.txt')
data = json.load(f)
f.close()
with open("output.csv", mode="w", newline='') as out:
w = csv.writer(out)
header = ["id","name","path","tags","points"]
w.writerow(header)
for asset in data["assets"]:
data_point = data["assets"][asset]
output = [data_point["asset"]["id"]]
output.append(data_point["asset"]["name"])
output.append(data_point["asset"]["path"])
output.append(data_point["regions"][0]["tags"])
output.append(data_point["regions"][0]["points"])
w.writerow(output)
输出
您还应该根据提供的数据提供一个示例输出。此外,你还应该展示你已经尝试了什么,以及为什么它不起作用。如果你挣扎,我们会帮助你,但不是为你解决问题。自己努力解决这个问题。有关如何提出好问题的更多信息,请参阅和。是的,我明白。我将编辑问题并提供更多信息info@AlexanderPushkarev为什么他要在CSV中表示嵌套的JSON,而他只需要CSV中未嵌套的JSON文件的一部分。这非常有用!我现在明白了,我在寻找一个非常远的解决方案(标准化和平坦化),而您的解决方案要整洁得多。@jonny3000不客气。请注意,区域是一个数组,在您的示例中,它只有一个元素,这就是我将
[0]
放在那里的原因。但如果有更多的因素,你必须正确地解决这个问题。但我想既然你说的是4分,它可能总是只有1分的大小?是的,平坦化和正常化可能不是正确的方法。
id,name,path,tags,points
0b8f6f214dc7066b00b50ae16cf25cf6,1.jpg,c:\temp\1.jpg,"['3', '9', 'Dark Poor']","[{'x': 167.41071428571428, 'y': 252.02922077922076}, {'x': 208.80681818181816, 'y': 891.2337662337662}, {'x': 1252.232142857143, 'y': 936.2824675324675}, {'x': 1279.017857142857, 'y': 241.07142857142856}]"
0155d8143c8cad85b5b9d392fd2895a4,2.jpg,c:\temp\2.jpg,['Dark Poor'],"[{'x': 152.39423076923077, 'y': 311.68831168831167}, {'x': 144.08653846153848, 'y': 802.077922077922}, {'x': 964.4711538461539, 'y': 781.2987012987012}, {'x': 935.3942307692308, 'y': 299.2207792207792}]"