python3 读excel转Json文件

Python016

python3 读excel转Json文件,第1张

from xlrd import *

import json

# 参考1-字典、列表转JSON:https://www.cnblogs.com/longchang/p/10904850.html

# 参考2-JSON直接保存到文件:https://www.cnblogs.com/miyatest/p/9603897.html

# 从excel读取数据存放到列表中

def readExcel():

    keyData=[]   # 定义空List,用于保存读到的行数据

    excelBook=open_workbook("data.xlsx")    # 从当前目录读取《data.xlsx》文件

    table=excelBook.sheet_by_name("data")  # 从《data.xlsx》中找名为 data的sheet页

    rowNum=table.nrows  # 获取《data.xlsx》-->data页中 行数

    colNum=table.ncols  # 获取《data.xlsx》-->data页中 列数

    colName=table.row_values(0)    # 取第一行数据,即列名,colName 是个List

    # print(colName)

    if rowNum<=1:

        print("没数据...")    # 如果行数<=1,说明没有数据,因第1行一般定义为列名

    else:

        for i in range(rowNum-1):

            d={}    # 定义空字典,用于存放获取到数据

            values=table.row_values(i+1)    # 获取每行的数据,values最终是个List

            # print(values)

            for x in range(colNum):    #  每个列作为字典的一组数据

                d[colName[x]]=values[x]   #  用colName值作为字典的key,values值作业为字典的value

                # print(d)

            keyData.append(d)    # 读完一行数据保存到字典,再保存到列表

    # print(keyData)

    return keyData   #  全部数据读完并保存到列表后,返回

#  列表转Json

def listToJson():

     keyParam=readExcel()    # 调用从excel读取数据的函数,把数据保存到列表

    CaseConfig=open("CaseConfig.json", mode="w+")    #  创建json文件

    CaseConfig.write('{\n"key":')    # 往json文件中写数据,先写json的格式的{,和模块名

      # 把从excel读取的数据转成Json格式保存入 CaseConfig,indent=4是进行格式化,使json排版好看

    json.dump(keyParam, CaseConfig, indent=4)  

    CaseConfig.write('\n}')   # 往json文件中写数据,写结尾的 },写前先换行

    CaseConfig.close()    # 关闭json文件,必要!!

if __name__ == '__main__':        #  调试调用

    listToJson()

在研究 k8s 的yaml 配置文件的时候,我总担心自己一不小心 会写错,所以我向往 使用将对象 序列化 yaml 的形式,

其实 python object 可以 直接 转 yaml ,甚至也可以 直接 转成yaml文件!!!

这里 会经常用到几个 函数vars() ast.

我们先尝试用最笨的方法 实现 object到yaml 的转化

在python对象 convert to dict 的形式,使用 vars()函数

然后 dict convert to json 使用 json.dumps(dict)函数

然后 json converte to yaml 使用 ya= yaml.load(json.dumps(dict)) 然后

再 yaml.safe_dump(ya,default_flow_style=False)

至此我们看到 从 python Object --->dict ----> json --->yaml 的转化

其中 obj dict json yaml 转 string ,只要 str()函数即可,或者 str(vars())结合

yaml 格式 写入到文件 ,需要注意的是, open()函数 的mode 一定要是 'w' ,不能是’wb', b代表是二进制写入

yaml 写入的是dict str,使用 ‘wb' 会报错,[yaml TypeError: a bytes-like object is required, not 'str']

【出现该错误往往是通过open()函数打开文本文件时,使用了‘rb’属性,如:fileHandle=open(filename,'rb'),则此时是通过二进制方式打开文件的,所以在后面处理时如果使用了str()函数,就会出现该错误,该错误不会再python2中出现。

具体解决方法有以下两种:

第一种,在open()函数中使用‘r’属性,即文本方式读取,而不是‘rb’,以二进制文件方式读取,可以直接解决问题。

第二种,在open()函数中使用‘rb’,可以在使用之前进行转换,有以下实例,来自: http://stackoverflow.com/questions/33054527/python-3-5-typeerror-a-bytes-like-object-is-required-not-str 】

其实 python object 可以 直接 转 yaml ,甚至也可以 直接 转成yaml文件!!!

比如我已经定义了一个 Dog python class,他有 好几个属性 并已经赋值初始化了

另外生成 yaml 对象

生成yaml文件

结果是

反过来 yaml ---->json --->持久化 json 文件 indent=1属性是为了让 json 不以单行展示,而是展开

注意的是 python 的 dict 和set 很相似 ,都是 { }, set 里是list, dict 是键值对

【# set object is not JSON serializable [duplicate]

打开 demo.json

yaml --->dict

yaml --->python object

json -->dict

json.loads()

dict-->json

json.jumps()

str --->dict

newdict=dict(str)

json -- >python object

一个python object无法直接与json转化,只能先将对象转化成dictionary,再转化成json;对json,也只能先转换成dictionary,再转化成object,通过实践,源码如下:

yaml -->python object

对yaml,也只能先转换成json --->dictionary,再转化成object,通过实践,源码如下:

dict -- ->python object

python对象 默认都有一个 私有的属性 dict 取值 就是 object的 字典形式, 赋值就就可以给对象属性对应赋值

例如json 转 对象

对象 转 json

Python之dict(或对象)与json之间的互相转化

在Python语言中,json数据与dict字典以及对象之间的转化,是必不可少的操作。

dict字典转json数据

对象转json数据

json数据转成dict字典

json数据转成对象

json的load()与dump()方法的使用

dump()方法的使用

python中使用json模块实现python对象与json的转换

要处理的是文件而不是字符串,你可以使用 json.dump() 和 json.load() 来编码和解码JSON数据

Json Schema 是一个用于验证Json数据结构的强大工具

使用范围: 接口测试中数据值校验、数据类型校验、json数据结构校验

官网: https://json-schema.org/understanding-json-schema/conventions.html

安装: pip install jsonschema

type 关键字是json模式的基础,指定架构的数据类型:string、number、object、array、boolean、null

object关键字,在python中对应的是dict类型

数组属性array,用于有序元素

在python中,array类似于list或tuple

在Json,通常有2种方式验证

1. 列表验证: 任意长度的序列,其中每个元素匹配相同的模式

2. 元组验证: 一个固定长度的序列,其中每个项目可能具有不同的模式

1. 列表验证

2. 元组验证

针对每一个元素解释说明,默认校验schema中设置的前n项

将items关键字设置成一个数组, 其中每个项目都是一个与文档数组的每个索引相对应的模式,

也就是一个数组, 第一个元素模式验证输入数组的第一个元素. 第二个元素模式验证输入数组的第二个元素

例如, 在以下的模式, anyOf关键字用于表示给定值可能对任何给定的子模式有效。第一个子模式需要一个最大长度为5的字符串。第二个子模式需要一个最小值为0的数字。只要一个值对这些模式中的任何一个进行验证,它就被认为整个组合模式有效。

{ ‘anyOf’: [ {‘type’: ‘string’, ‘maxLength’: 5}, {‘type’:’string’, ‘minimum’: 0 }]}

用于组合模式的关键字是:

该$schema关键字用于声明JSON片段实际上是JSON模式的一部分。它还声明了针对该模式编写的JSON Schema标准的哪个版本。

建议所有JSON模式都有一个$schema条目,该条目必须位于根目录下。因此,大多数情况下,您需要在架构的根目录下: