用python读取json文件,并放入Excel
2018-05-21 15:31
204 查看
最近需要读很多json文件,读到的数据放入excel里。
梳理了一下流程:
1. 导入os,glob模块,读取不同文件夹的不同json文件,放入excel不同的位置
2. 导入json模块,读取json文件,查看json文件格式,是否有乱码,手动处理或者代码中处理
3. 导入xlwt模块,写Excel,将可以固定的内容写入excel,作为模版
主要难点:
1. 如何读取多个人的数据(json文件)。
2. 如何判断每个人的文件夹里的Question都有哪些,有的读出来放到excel相应位置,没有的怎么办,是用一个符号代替,填进去,还是空着。
3. 如何把每个人的数据横向的放入excel正确的位置。
4. 如何将多个人的数据放入excel正确的位置。
我个人首先解决的是写一个excel,将固定内容写进去,制作一个模版。
# 创建一个工作簿 f = xlwt.Workbook() # 创建一个sheet sheet1 = f.add_sheet('P1D1',cell_overwrite_ok=True) # 写内容,row行数,column列数(都是从0开始) sheet1.write(row,column,'P1D1') ''' 合并单元格sheet.write_merge(x,x+m,y,w+n,string,style) x表示行,y表示列,m表示跨行个数,n表示跨列个数 string表示写入的单元格内容,style表示单元格风格 ''' ''' 第一个参数2表示第3行,第二个参数2表示还是第三行,跨行个数相当于0 第三个参数1表示第2列,第四个参数4表示第5列,合并的单元格相当于是第3行的第2列到第5列 ''' sheet1.write_merge(2, 2, 1, 4, 'Touch-01', set_style()) ''' 如果一行有很多的固定内容,可以不指定位置,通过遍历依次放入 ''' # 生成第4行,将row13的参数依次写进去 row13 = ['数据', 'DrawStart', 'DrawStop', 'TimeBegin', 'TimeEnd'] for a0 in range(0, len(row13)): sheet1.write(3, a0, row13[a0], set_style()) ''' 这就是一个sheet的写法,如果一个Excel表格有很多sheet,依次add_sheet,写内容 '''
其次,解决的问题是读取json文件,代码很简单。
需要注意的是,如果json文件中内容含有中文,代码中需加入encoding=’utf-8’,不会报错,正确读出中文。
Question_02.json文件打开就说file was loaded in the wrong encoding:’utf-8’,中文显示的地方全是乱码,为了让代码正常运行,需加入errors=’ignore’
with open('xxx','r',encoding='utf-8') as f: json.load(f)
最重要的就是流程1的解决,主要难点也集中在这里,主要自己对于循环和遍历的实际应用不到位。
''' path可以设绝对路径,也可以设相对路径 绝对路径:就是最完整的路径,'\'在python中为字符串转义字符,所以用r'\'表示绝对路径 相对路径:不完整的路径,就是当前py文件所处的路径 你写的相对路径必须是当前文件夹A里的文件a或者A里的文件夹B里的文件才可以open '/'表示相对路径,等同于'\\' path1=os.path.abspath('.')#获取当前脚本所在的路径 path2=os.path.abspath('..')#获取当前脚本所在路径的上一级路径 ''' path='xxx' def traversal1(sheet,row): # 判断给出的路径是否真的存在 if os.path.exists(path): '''glob.glob 获取指定目录下的所有文件(夹) 返回所有匹配的文件路径列表 可以用绝对路径,也可以用相对路径 ''' files = glob.glob(path + '\\*') # print(files) # files返回的是一个list,遍历这个list for file in files: Q1 = file + '\\' +'Question_01.json' # 判断给出的路径是否真的存在 if os.path.exists(Q1): ''' 打开json文件 内容有中文要加encoding='utf-8' 内容有乱码要加errors='ignore' json.load 读json文件 ''' with open(Q1,'r',encoding='utf-8') as f: Q1= json.load(f) ''' 由于每个json文件都是一个dict,都有datanum这个key,对应的value就是次数 通过Q1['DataNum]读出次数,设一个初始的空list,遍历次数,将'Touch-01' 分解成 'Touch-0' + str(i+1) 再设一个临时的空list,用list.append 依次读出不同的touch里的不同的key的value并将其放入 用list.extend 将临时的list放入初始的list excel表格里的touch是10次,根据json文件读取出的实际次数,不够10次的位置用 '-'代替 所以有了XL公式,(10-datanum)* 4,将XL放入初始list ''' datanum = Q1['DataNum'] data_infos_list = [] for i in range(datanum): touch_key = 'Touch-0' + str(i + 1) temp = [] temp.append(Q1[touch_key][0]['DrawStart']) temp.append(Q1[touch_key][0]['DrawStop']) temp.append(Q1[touch_key][0]['TimeBegin']) temp.append(Q1[touch_key][0]['TimeEnd']) data_infos_list.extend(temp) XL = ['-'] * (10 - datanum) * 4 data_infos_list.extend(XL) # 如果该路径不存在 else: # 设一个空list,将'-'填充入excel-Question_01的所有位置 data_infos_list = [] XL = ['-'] * 40 data_infos_list.extend(XL) ''' 在最后设置一个循环,data_infos_list里已经有了相应的元素,遍历之,sheet,write 写入相应位置,row是行,j是列 j=j+1在循环内,row=row+1在循环外 row和sheet是函数的两个参数,调用该函数的时候,设置行数和指定sheet ''' j = 1 for data_infos in data_infos_list: sheet.write(row, j, data_infos) j += 1 row += 1
''' 之前str分割规则只适用于datanum在0到9之间 在读取Question_02.json的时候要注意datanum可能为10 ''' ''' 这里和之前有所区别,因为datanum可能大于9,'Touch-0' +str(i+1)这种情况只能i在0到8之间 'Touch-010'是读不出来的,因为json文件里是'Touch-10' 所以这里做一个判断,如果datanum小于10,str分解成'Touch-0' + str(i+1) 如果datanum大于等于10, i小于9的部分,str分解成'Touch-0' + str(i+1) i大于等于9的部分,str分解成'Touch-' +str(i+1) ''' if datanum < 10: for i in range(datanum): touch_key = 'Touch-0' + str(i + 1) temp = [] # 在读TotalTime这个key的时候,要注意之前还包含了一个参数Book temp.append(Q2[touch_key][0]['Book'][0]['TotalTime']) temp.append(Q2[touch_key][0]['Queue']) temp.append(Q2[touch_key][0]['Success']) temp.append(Q2[touch_key][0]['TimeBegin']) temp.append(Q2[touch_key][0]['TimeEnd']) data_infos_list.extend(temp) XL = ['-'] * (10 - datanum) * 5 data_infos_list.extend(XL) else: for i in range(datanum): if i < 9: touch_key = 'Touch-0' + str(i + 1) elif i >= 9: touch_key = 'Touch-' + str(i + 1) temp = [] temp.append(Q2[touch_key][0]['Book'][0]['TotalTime']) temp.append(Q2[touch_key][0]['Queue']) temp.append(Q2[touch_key][0]['Success']) temp.append(Q2[touch_key][0]['TimeBegin']) temp.append(Q2[touch_key][0]['TimeEnd']) data_infos_list.extend(temp) XL = ['-'] * (10 - datanum) * 5 data_infos_list.extend(XL) else: data_infos_list = [] XL = ['-'] * 50 data_infos_list.extend(XL)
''' 这个解决了如何读取一个人的数据放入Excel之后,自动加一行,放入下一个人的数据 读取的json文件本身是dict,data_list必须为列表形式才能遍历 ''' i = 1 for data in data_list: sheet.write(row,i,data) i += 1 row += 1
PS:
os模块里,最好先做判断 if os.path.exists(path):
glob.glob获取指定目录下的所有文件(夹),返回所有匹配的文件路径列表
以上就是持续了10天的task的心得,对于循环,遍历,判断有了更深的理解。
阅读更多相关文章推荐
- python读取json格式文件和用pandas读取excel文件
- python读取json文件转成excel
- js读取并解析excel文件,之后上传json到服务器
- python读取csv文件并把文件放入一个list中脚本实例
- Python Excel Tutorial (一):xlrd的安装和读取Excel文件
- 【python】 读取Excel文件并绘制图表
- Python 读取写入 json 格式的文件
- python 读取文件 并实现文件相关操作最后导出excel
- Python 读取EXCEL(XLS、CSV)写入txt文件
- 用Python实现Excel导出Json文件
- Python导出数据到Excel可读取的CSV文件的方法
- python json及mysql——读取json文件存sql、数据库日期类型转换、终端操纵mysql及python codecs读取大文件问题
- C#读取excel文件,生成json
- Python+pandas读取Excel文件并统计演员参演电影数量
- python-读取excel,txt,csv文件
- xlrd---Python中读取excel文件的利器
- python读取excel文件中所有sheet表格:openpyxl模块(二)
- 【学习笔记】python读取json内容转换成excel格式
- Python读取和写入Excel文件[整]
- 用python读取json格式内容并保存到excel中