【问题标题】:Json to CSV file conversion using python使用 python 将 Json 转换为 CSV 文件
【发布时间】:2022-09-23 21:21:15
【问题描述】:

我有一个像这样的示例 JSON 文件

data = {
    \"type\": \"video\",
    \"videoID\": \"vid001\",
    \"links\": [
        {\"type\": \"video\", \"videoID\": \"vid002\", \"links\": []},
        {\"type\": \"video\",
         \"videoID\": \"vid003\",
         \"links\": [
             {\"type\": \"video\", \"videoID\": \"vid004\"},
             {\"type\": \"video\", \"videoID\": \"vid005\"},
         ]
         },
        {\"type\": \"video\", \"videoID\": \"vid006\"},
        {\"type\": \"video\",
         \"videoID\": \"vid007\",
         \"links\": [
             {\"type\": \"video\", \"videoID\": \"vid008\", \"links\": [
                 {\"type\": \"video\",
                  \"videoID\": \"vid009\",
                  \"links\": [{\"type\": \"video\", \"videoID\": \"vid010\"}]
                  }
             ]}
         ]},
    ]
}

我只需要服用特定的键和值从 json 文件并将其转换为 CSV 文件

代码:参考:Extracting Specific Keys/Values From A Messed-Up JSON File (Python)

def extract(data, keys):
    out = []
    queue = [data]
    while len(queue) > 0:
        current = queue.pop(0)
        if type(current) == dict:
            for key in keys:
                if key in current:
                    out.append({key: current[key]})

            for val in current.values():
                if type(val) in [list, dict]:
                    queue.append(val)
        elif type(current) == list:
            queue.extend(current)
    return out

x = extract(data, [\"videoID\",\"type\"])
print(pd.DataFrame.from_dict(x))

当我通过 extract() 传递 2 个值时,在两者之间获取 NaN result

videoID   type
0   vid001    NaN
1      NaN  video
2   vid002    NaN
3      NaN  video
4   vid003    NaN
5      NaN  video
6   vid006    NaN
7      NaN  video
8   vid007    NaN
9      NaN  video
10  vid004    NaN
11     NaN  video
12  vid005    NaN
13     NaN  video
14  vid008    NaN
15     NaN  video
16  vid009    NaN
17     NaN  video
18  vid010    NaN
19     NaN  video

我需要得到如下输出

    videoID   type
0   vid001    video
1   vid002    video
2   vid003    video
3   vid004    video
etc...

并将其转换为 csv 文件,有人可以帮我解决这个问题吗

    标签: python json pandas api csv


    【解决方案1】:

    尝试递归:

    def get_type_videoid(o):
        if isinstance(o, dict):
            if "type" in o and "videoID" in o:
                yield o["videoID"], o["type"]
            for v in o.values():
                yield from get_type_videoid(v)
        elif isinstance(o, list):
            for v in o:
                yield from get_type_videoid(v)
    
    
    df = pd.DataFrame(get_type_videoid(data), columns=["videoID", "type"])
    print(df)
    

    印刷:

      videoID   type
    0  vid001  video
    1  vid002  video
    2  vid003  video
    3  vid004  video
    4  vid005  video
    5  vid006  video
    6  vid007  video
    7  vid008  video
    8  vid009  video
    9  vid010  video
    

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 2019-03-25
      • 2023-03-03
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      相关资源
      最近更新 更多