欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

利用Python 将csv数据以字典形式写入json 知识点【csv和json文件操作,有序字典】

程序员文章站 2022-03-17 20:59:35
...

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 将csv数据以字典形式写入json 知识点【csv和json文件操作,有序字典】

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

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