利用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('写入失败,重新检查代码')
最终成果:
大概想法是这样,但代码尚有一些地方可以优化,比如:
1.在类型转换时,使用col_type一个list保存每一个待转换的变量,这样的扩展性并不好,当csv文件中列数量较多的时候,就容易翻车。
2.json 文件缩进问题,目前使用indent参数只能解决 { → “1001” 的缩进问题,但是第二个 { → “RaceID” 距离尚无法解决。
以上两个问题,新人弟弟还没有什么好的解决方法,路过的各位大家多多交流啊,有评必回