首页 > 编程知识 正文

python3教程,qpython

时间:2023-05-03 06:31:35 阅读:42343 作者:2730

YAML是计算机可识别的直观数据序列化格式,便于人类阅读,也便于与脚本语言交互。 YML类似于XML,但语法比XML简单得多,在转换为数组或可混列数据时更简单有效。

一. PyYaml

1,load ) ) :返回一个对象

首先创建yml文件,config.yml:

name : tomsmithage :37 spouse : name : janesmithage :25 children :-name : jimmysmithage 336015-name 133: jeshage

importyamlf=open (r ' e : ) (自动测试(test _ framework (config (config.yml () y=yaml.load(f ) f ) prinnnng )

{'name': 'Tom Smith ',' age': 37,' spouse ' : { ' name ' : ' Jane Smith ',' age': 25},' chill

如果string或文件包含多个yaml文档,则可以使用yaml.load_all分析所有文档。

importyamlf=' ' ' '---name : James age :20---- name : sxdxmtage :19 ' ' y=YAML.load _ all (f ) fordated

{'name': 'James ',' age ' :20 } { ' name ' : ' sxd xmt ',' age': 19} 3,yaml.dump是一个python对象

importyamlaproject={ ' name ' : ' silenthandolleander ',' race': 'Human ',' traits': ['ONE_HAND

name : silenthandolleanderrace : human traits : [ one _ hand,ONE_EYE] yaml.dump接收的第二个参数是打开的文本文件

importyamlaproject={ ' name ' : ' silenthandolleander ',' race': 'Human ',' traits ' : [ ' one _ hand autauted

importyamlobj1={ ' name ' : ' James ',' age': 20}obj2=['sxdxmt ',19 ] withopen (r ' e : )自动物料管理系统

{age: 20,name: James}--- [sxdxmt,19]尼,yaml语法

1、基本规则

1 .大小写敏感2 .使用缩进表示级别关系3 .不要使用制表符进行缩进。 只能用空间。 4 .缩进的空间数并不重要。 如果同一级别的元素左对齐,则5. #表示注释,并从该注释开始一直忽略到行尾。 2、yaml转换词典

yaml支持映射或词典表示,如下所示:

#以下格式读取为Python上的dictname:灰蓝age: 0job: Tester输出。

{'name': '灰蓝',' age': 0,' job': 'Tester'} 3,yaml转盘

yaml支持列表或数组的表示形式,如下所示:

#以下格式在Python中读取为list-灰色蓝- 0- Tester输出。

[ '灰蓝',0,' Tester'] 4,复合结构:

词典和列表可以按如下方式复合使用。

#以下格式在Python中读取list包含dict- name:灰蓝age : job : tester-name 3360 James age :30输出。

[{'name': '灰蓝',age':' job': 'Tester'} ',{'name': 'James ',' age'3360}3]

0}]

5、基本类型:
yaml中有以下基本类型:

字符串整型浮点型布尔型null时间日期

我们写个例子来看下:

# 这个例子输出一个字典,其中value包括所有基本类型str: "Hello World!"int: 110float: 3.141boolean: true # or falseNone: null # 也可以用 ~ 号来表示 nulltime: 2016-09-22t11:43:30.20+08:00 # ISO8601,写法百度date: 2016-09-22 # 同样ISO8601

输出:

{'str': 'Hello World!', 'int': 110, 'float': 3.141, 'boolean': True, 'None': None, 'time': datetime.datetime(2016, 9, 22, 3, 43, 30, 200000), 'date': datetime.date(2016, 9, 22)}

如果字符串没有空格或特殊字符,不需要加引号,但如果其中有空格或特殊字符,则需要加引号了

str: 灰蓝str1: "Hello World"str2: "HellonWorld"

输出:

{'str': '灰蓝', 'str1': 'Hello World', 'str2': 'HellonWorld'}

这里要注意单引号和双引号的区别,单引号中的特殊字符转到Python会被转义,也就是到最后是原样输出了,双引号不会被Python转义,到最后是输出了特殊字符;如:

str1: 'HellonWorld'str2: "HellonWorld"

输出:

{'str1': 'Hello\nWorld', 'str2': 'HellonWorld'}

可以看到,单引号中的’n’最后是输出了,双引号中的’n’最后是转义成了回车
6、引用
& 和 * 用于引用

name: &name 灰蓝tester: *name

这个相当于一下脚本:

name: 灰蓝tester: 灰蓝

输出:

{'name': '灰蓝', 'tester': '灰蓝'}

7、强制转换
yaml是可以进行强制转换的,用 !! 实现,如下:

str: !!str 3.14int: !!int "123"

输出:

{'int': 123, 'str': '3.14'}

明显能够看出123被强转成了int类型,而float型的3.14则被强转成了str型。
8、分段
在同一个yaml文件中,可以用 — 来分段,这样可以将多个文档写在一个文件中

---name: Jamesage: 20---name: sxdxmtage: 19

三、构造器(constructors)、表示器(representers)、解析器(resolvers )
1、yaml.YAMLObject
yaml.YAMLObject用元类来注册一个构造器(也就是代码里的 init() 方法),让你把yaml节点转为Python对象实例,用表示器(也就是代码里的 repr() 函数)来让你把Python对象转为yaml节点,看代码:

import yamlclass Person(yaml.YAMLObject): yaml_tag = '!person' def __init__(self, name, age): self.name = name self.age = age def __repr__(self): return '%s(name=%s, age=%d)' % (self.__class__.__name__, self.name, self.age)james = Person('James', 20)print (yaml.dump(james)) # Python对象实例转为yaml矮小的白开水 = yaml.load('!person {name: sxdxmt, age: 19}')print (矮小的白开水) # yaml转为Python对象实例

输出:

!person {age: 20, name: James}Person(name=sxdxmt, age=19)

2、yaml.add_constructor 和 yaml.add_representer
你可能在使用过程中并不想通过上面这种元类的方式,而是想定义正常的类,那么,可以用这两种方法

import yamlclass Person(object): def __init__(self, name, age): self.name = name self.age = age def __repr__(self): return 'Person(%s, %s)' % (self.name, self.age)james = Person('James', 20)print (yaml.dump(james)) # 没加表示器之前def person_repr(dumper, data): return dumper.represent_mapping(u'!person', {"name": data.name, "age": data.age}) # mapping表示器,用于dictyaml.add_representer(Person, person_repr) # 用add_representer方法为对象添加表示器print (yaml.dump(james)) # 加了表示器之后def person_cons(loader, node): value = loader.construct_mapping(node) # mapping构造器,用于dict name = value['name'] age = value['age'] return Person(name, age)yaml.add_constructor(u'!person', person_cons) # 用add_constructor方法为指定yaml标签添加构造器矮小的白开水 = yaml.load('!person {name: sxdxmt, age: 19}')print (矮小的白开水)

输出:

!!python/object:__main__.Person {age: 20, name: James}!person {age: 20, name: James}Person(sxdxmt, 19)

第一行是没加表示器之前,多丑!中间那行是加了表示器之后,变成了规范的格式,下面添加了构造器,能够把 !person 标签转化为Person对象。
四、示例
yaml是一种很清晰、简洁的格式,而且跟Python非常合拍,非常容易操作,我们在搭建自动化测试框架的时候,可以采用yaml作为配置文件,或者用例文件,下面给出一个用例的示例

# Test using included Django test app# First install python-django# Then launch the app in another terminal by doing# cd testapp# python manage.py testserver test_data.json# Once launched, tests can be executed via:# python resttest.py http://localhost:8000 miniapp-test.yaml---- config: - testset: "Tests using test app"- test: # create entity - name: "Basic get" - url: "/api/person/"- test: # create entity - name: "Get single person" - url: "/api/person/1/"- test: # create entity - name: "Get single person" - url: "/api/person/1/" - method: 'DELETE'- test: # create entity by PUT - name: "Create/update person" - url: "/api/person/1/" - method: "PUT" - body: '{"first_name": "Gaius","id": 1,"last_name": "Baltar","login": "gbaltar"}' - headers: {'Content-Type': 'application/json'}- test: # create entity by POST - name: "Create person" - url: "/api/person/" - method: "POST" - body: '{"first_name": "Willim","last_name": "Adama","login": "theadmiral"}' - headers: {Content-Type: application/json}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。