先说总体思路:转化分两步:一是读取,二是写入,就是这么简单
读取考虑json中的嵌套,也就是如何读取
写入csv,简单来说用函数写入就行.
写入的方式有多组数据拼接在一起写在一行,和多组数据写入多行.
本次分享的代码写入方式军囊括了这两种方法,并且以多层嵌套json为例子,教会基础的读取方法,以便于后续自己写不同嵌套方式的转化代码.
代码运行平台:Mac,代码运行需要路径是包含全部json文件的文件夹路径,所以需要rm .DS_Store
代码有详细注释,有用的希望支持一下
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,