<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
YAML是一種直觀的能夠被電腦識別的的資料序列化格式,容易被人類閱讀,並且容易和指令碼語言互動。YAML類似於XML,但是語法比XML簡單得多,對於轉化成陣列或可以hash的資料時是很簡單有效的。
1、load() :返回一個物件
我們先建立一個yml檔案,config.yml:
name: Tom Smith age: 37 spouse: name: Jane Smith age: 25 children: - name: Jimmy Smith age: 15 - name1: Jenny Smith age1: 12
讀取yml檔案:
import yaml f = open(r'E:AutomaticTestTest_Frameworkconfigconfig.yml') y = yaml.load(f) print (y)
結果:
{'name': 'Tom Smith', 'age': 37, 'spouse': {'name': 'Jane Smith', 'age': 25}, 'children': [{'name': 'Jimmy Smith', 'age': 15}, {'name1': 'Jenny Smith', 'age1': 12}]}
2、load_all()生成一個迭代器
如果string或檔案包含幾塊yaml檔案,你可以使用yaml.load_all來解析全部的檔案。
import yaml f = ''' --- name: James age: 20 --- name: Lily age: 19 ''' y = yaml.load_all(f) for data in y: print(data)
執行結果:
{'name': 'James', 'age': 20}
{'name': 'Lily', 'age': 19}
3、yaml.dump 將一個python物件生成為yaml檔案
import yaml aproject = {'name': 'Silenthand Olleander', 'race': 'Human', 'traits': ['ONE_HAND', 'ONE_EYE'] } print(yaml.dump(aproject,))
執行結果:
name: Silenthand Olleander
race: Human
traits: [ONE_HAND, ONE_EYE]
yaml.dump接收的第二個引數一定要是一個開啟的文字檔案或二進位制檔案,yaml.dump會把生成的yaml檔案寫到檔案裡
import yaml aproject = {'name': 'Silenthand Olleander', 'race': 'Human', 'traits': ['ONE_HAND', 'ONE_EYE'] } f = open(r'E:AutomaticTestTest_Frameworkconfigconfig.yml','w') print(yaml.dump(aproject,f))
4、yaml.dump_all()將多個段輸出到一個檔案中
import yaml obj1 = {"name": "James", "age": 20} obj2 = ["Lily", 19] with open(r'E:AutomaticTestTest_Frameworkconfigconfig.yml', 'w') as f: yaml.dump_all([obj1, obj2], f)
輸出到檔案:
{age: 20, name: James}
--- [Lily, 19]
1. 大小寫敏感
2. 使用縮排表示層級關係
3. 縮排時不允許使用Tab,只允許使用空格
4. 縮排的空格數目不重要,只要相同層級的元素左對齊即可
5. # 表示註釋,從它開始到行尾都被忽略
yaml中支援對映或字典的表示,如下:
# 下面格式讀到Python裡會是個dict name: 灰藍 age: 0 job: Tester
輸出:
{'name': '灰藍', 'age': 0, 'job': 'Tester'}
yaml中支援列表或陣列的表示,如下:
# 下面格式讀到Python裡會是個list - 灰藍 - 0 - Tester
輸出:
['灰藍', 0, 'Tester']
字典和列表可以複合起來使用,如下:
# 下面格式讀到Python裡是個list裡包含dict - name: 灰藍 age: 0 job: Tester - name: James age: 30
輸出:
[{'name': '灰藍', 'age': 0, 'job': 'Tester'}, {'name': 'James', 'age': 30}]
yaml中有以下基本型別:
我們寫個例子來看下:
# 這個例子輸出一個字典,其中value包括所有基本型別 str: "Hello World!" int: 110 float: 3.141 boolean: true # or false None: null # 也可以用 ~ 號來表示 null time: 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’最後是跳脫成了回車
& 和 * 用於參照
name: &name 灰藍 tester: *name
這個相當於一下指令碼:
name: 灰藍 tester: 灰藍
輸出:
{'name': '灰藍', 'tester': '灰藍'}
yaml是可以進行強制轉換的,用 !! 實現,如下:
str: !!str 3.14 int: !!int "123"
輸出:
{'int': 123, 'str': '3.14'}
明顯能夠看出123被強轉成了int型別,而float型的3.14則被強轉成了str型。
在同一個yaml檔案中,可以用 — 來分段,這樣可以將多個檔案寫在一個檔案中
--- name: James age: 20 --- name: Lily age: 19
1、yaml.YAMLObject
yaml.YAMLObject用元類來註冊一個構造器(也就是程式碼裡的 init() 方法),讓你把yaml節點轉為Python物件範例,用表示器(也就是程式碼裡的 repr() 函數)來讓你把Python物件轉為yaml節點,看程式碼:
import yaml class 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 lily = yaml.load('!person {name: Lily, age: 19}') print (lily) # yaml轉為Python物件範例
輸出:
!person {age: 20, name: James}
Person(name=Lily, age=19)
2、yaml.add_constructor 和 yaml.add_representer
你可能在使用過程中並不想通過上面這種元類的方式,而是想定義正常的類,那麼,可以用這兩種方法
import yaml class 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表示器,用於dict yaml.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標籤新增構造器 lily = yaml.load('!person {name: Lily, age: 19}') print (lily)
輸出:
!!python/object:__main__.Person {age: 20, name: James}
!person {age: 20, name: James}
Person(Lily, 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}
到此這篇關於Python組態檔yaml的用法詳解的文章就介紹到這了,更多相關Python yaml用法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45