python:1.多层嵌套json转csv方法2.规避ValueError:too many values to unpack (expected 2)错误

先说总体思路:转化分两步:一是读取,二是写入,就是这么简单

  1. 读取考虑json中的嵌套,也就是如何读取

  1. 写入csv,简单来说用函数写入就行.

  1. 写入的方式有多组数据拼接在一起写在一行,和多组数据写入多行.

  1. 本次分享的代码写入方式军囊括了这两种方法,并且以多层嵌套json为例子,教会基础的读取方法,以便于后续自己写不同嵌套方式的转化代码.

  1. 代码运行平台:Mac,代码运行需要路径是包含全部json文件的文件夹路径,所以需要rm .DS_Store

  1. 代码有详细注释,有用的希望支持一下

import json
import csv
import os

# 该py文件将json转化为csv ,将json中所有元素(键值对)写入csv中
# 编写此文件所需要注意的点
"""
 1。在遍历json时如果直接使用for k,v in dict,
    可能出现ValueError:too many values to unpack (expected 2)错误,
   为了避免错误,代码第二次写入csv使用的其他办法,也是解决办法
"""


def json2csv(data_path, output_path):
    # files是list类型
    files = os.listdir(data_path)
    out_path = output_path + "/" + "json.csv"
    f = open(out_path, 'w', encoding='utf-8', newline='')
    for file in files:  # 遍历文件夹内json文件
        position = data_path + "/" + file
        # 打开json文件
        with open(position, 'r') as json_obj:
            json_data = json.load(json_obj)
            # 创建并打开csv文件

            csv_writer = csv.writer(f)

            json_list = json_data['dataList']
            # 储存 json文件 的 键
            json_title = []
            for k in json_list[0]:
                json_title.append(k)
            for k in json_list[0]["attributes"]["xtBusinessType"]:
                json_title.append(k)
            # 删除多余重复json的键
            json_title.remove("attributes")
            # 写入json的 键                                   第一次写入
            csv_writer.writerow(json_title)

            # 以下两个变量储存json 的 值
            json_value0 = []
            json_value1 = []
            # num是dataList元素的个数,dataList在json谈到
            num = json_data["total"]
            for i in range(num):  # 第二次写入
                for k in json_list[i]["attributes"]["xtBusinessType"]:
                    v = json_list[i]["attributes"]["xtBusinessType"][k]  # 获取 键=k 的值
                    json_value1.append(v)
                del json_list[i]["attributes"]  # 删除多余重复的键值对
                for k in json_list[i]:
                    v = json_list[i][k]  # 获取 键=k 的值
                    json_value0.append(v)
                csv_writer.writerow(json_value0 + json_value1)
                json_value0.clear()  # 清空
                json_value1.clear()

    f.close()


if __name__ == '__main__':
    # 保存json的文件夹     三个*号是自己电脑名字,一般路径请直接替换即可
    path = "/Users/***/Downloads/PyProject/project/projectFile"
    # 保存csv的文件夹
    output = "/Users/***/Downloads/PyProject/project/csv"
    json2csv(path, output)

py文件变量详细解说

1.json_title获取的键是从id开始,前面的success,failureCode,failureInfo不需要.

2.del json_list[i]["attributes"]的目的是因为attributes内还有嵌套,已经获取了嵌套内内容,无需多出一列attributes

json代码例子

{ 
  "success": true,             #前三个是无关紧要的键值对,因为这个json,第一层是个字典,
  "failureCode": null,         #最外层字典包含了囊括所有数据的一个键值对,就是dataList
  "failureInfo": null,         #最外层字典只需要提取出dataList这个键中的值即可
  "dataList": [     #dataList对应的元素是一个列表,列表元素是字典
    {                           #第一个元素
      "id": ,                       
      "basicId": "",             #第一层嵌套从id开始    
      "type": "",                  
      "name": "",
      "location": "", 
      "attributes": {           #第二层嵌套从attributes开始
        "xtBusinessType": {      #第三层嵌套从xtBusinessType开始
          "1": "",   #这一层键值对的值已经略去,可以想象有数值键的值也该为数字序号
          "2": null,           
          "3": "",             #该键值对的键string,值也是string,因为带“”
          "4": null,
          "5": null,
          "6": null,
          "7":78 ,        #该键值对 键是string,值是整型,值为78
          "8": "",
          "9": null,
          "10": null,
          "11": "",
          "12": null,
          "13": null,
          "14": null, 
          "15": 0.0,       #该键值对 键是string,值是整型
          "16": "",
          "17": "",
          "18": "",
          "19": "",
          "20": "",
          "21": "",
          "22": "",
          "21": "",
          "24": null     #可以看到,键值对的键全是string,值有的是整型,有的是string
        },
        "0": [      #这一个属于attributes中的键值对,已经从xtBusinessType跳出
          
        ]
      }
    },
    
    {                        #第二个元素...往下省略多个元素
      "id": 13391,
      

你可能感兴趣的:(json,python)