您的位置:首页 > 编程语言 > Python开发

用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的心得,对于循环,遍历,判断有了更深的理解。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: