用python读取json文件,并放入Excel

最近需要读很多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的心得,对于循环,遍历,判断有了更深的理解。

猜你喜欢

转载自blog.csdn.net/HARD_FAN/article/details/80392941
今日推荐