csv文件格式

ID,RaceID,ModelID,IconID,Name,Description,ColorationID
1001,1,1011,70014,大酋长,部落的大酋长。,ui_color_y
1002,1,1011,70014,大酋长,部落的大酋长。,ui_color_r
1003,1,1011,70014,大酋长,部落的大酋长。,ui_color_g
1004,1,1011,70014,大酋长,部落的大酋长。,ui_color_p
1005,1,1011,70014,大酋长,部落的大酋长。,ui_color_o
1011,1,1012,70015,战神,战神的盔甲,神圣不可侵犯。,ui_color_w
1013,1,1012,70015,战神,战神的盔甲,神圣不可侵犯。,ui_color_teal
.....

json文件格式

{
	"1001":{
				"RaceID":1,
				"ModelID":1011,
				"IconID":70014,
				"Name":"大酋长",
				"Description":"部落的大酋长。",
				"ColorationID":"ui_color_y"
	},
	"1002":{
				"RaceID":1,
				"ModelID":1011,
				"IconID":70014,
				"Name":"大酋长",
				"Description":"部落的大酋长。",
				"ColorationID":"ui_color_r"			
	}
}

目的:将csv中全部数据按照示例json中的格式写入到一个json文件中

思路要点:
1.利用csv库中的DictReader(),以字典形式读取csv文件中的数据,同时创建两个空字典,用于数据的保存
2.csv文件读出时,数据强制产生为str类型,根据题目要求,需针对性转换类型
3.字典的遍历是不保证顺序的,但一定保证每个元素都被遍历一次,但是在这里因为题目要求,还是希望使用顺序遍历的字典,所以使用OrdeDict()创建两个有序字典

# -*- coding:utf-8 -*-
# -*- coding:utf-8 -*-
import json
import csv
import sys
import codecs
from collections import OrderedDict
reload(sys)
sys.setdefaultencoding('gbk')                          #*设置本文件默认编码格式为gbk*
import pandas as pd
from copy import deepcopy


def make_data(file):
    json_data = OrderedDict()                                  # 创建有序字典
    col_type = [int, int, int, str, str, str]                  # 用列表形式保存想转换的数据类型
    data1=list(pd.read_csv(file).columns)                      # 读取csv文件中首行内容,以列表形式存储在data1中
    csv_file=open(file,'r')                                    # open()函数打开csv文件,返回file对象
    data2=csv.DictReader(csv_file,fieldnames=data1)            # 以字典方式读取csv数据,并且以filenames作为键
    header_list=deepcopy(data1)                                # 深拷贝,防止后续的修改影响到data1,从而导致报错
    header_list.remove('ID')                                   # 去除ID元素
    next(data2)                                                # data2是DictReader()对象,next相当于去除掉首行内容,从第二行开始
    convert_tuple=zip(col_type,header_list)                    # zip()利用两个可迭代对象,将对象中对应的元素打包成一个个元祖,返回元祖列表

    for row in data2:
        json_data[row['ID']] = OrderedDict()                   # 创建第二个有序字典,先生成row['ID']的值的键
        for convert,headers in convert_tuple:                  # 同时取出带转换数据类型和表头信息
            json_data[row['ID']][headers]=convert(row[headers])         # 索引取得row[headers]值,经过类型转换,赋值给json_data对应位置

    csv_file.close()
    return json_data


if __name__ == '__main__':

    try:
        json_data=make_data('Q8.csv')
        with open('Q8_example.json', 'w') as wf:                    # 以写方式打开json文件
            json.dump(json_data, wf, ensure_ascii=False, indent=4)  # ensure_ascii=False 可支持输出中文,indent设置缩进
            print('已完成写入')
    except :
        print('写入失败,重新检查代码')

最终成果:

python写入json文件怎么分行 python将数据写入json文件_数据

大概想法是这样,但代码尚有一些地方可以优化,比如:
1.在类型转换时,使用col_type一个list保存每一个待转换的变量,这样的扩展性并不好,当csv文件中列数量较多的时候,就容易翻车。
2.json 文件缩进问题,目前使用indent参数只能解决 { → “1001” 的缩进问题,但是第二个 { → “RaceID” 距离尚无法解决。

以上两个问题,新人弟弟还没有什么好的解决方法,路过的各位大家多多交流啊,有评必回