Python从新手到大师——15:配置文件yaml

python配置文件

1、经试验以“.yml”结尾的配置文件更好用。虽然以“.yaml”也可以使用,但是坑太多,不建议使用
2、yaml配置文件规则写法如下:
yaml基本语法
  1、大小写敏感
  2、使用缩进表示层级关系
  3、缩进时不允许使用tab,是允许使用空格
  4、缩进时空格数目不重要,只要相同层级的元素左对齐即可
  5、# 表示注释,从它开始到行尾被忽略
  6、使用 --- 来进行每条信息的区别

---
name: Tom Smith
age: 37
spouse:
    name: Jane Smith
    age: 25
children:
 - name: Jimmy Smith
   age: 15
 - name1: Jenny Smith
   age1: 12


---
name: James
age: 20
---
name: Lily
age: 19

---
name: Silenthand Olleander
race: Human
traits: [ONE_HAND, ONE_EYE]

---
{age: 220, name1: James}
--- [Lily1, 129]


---
# 在python中会变成字典
name: 灰蓝
age: 0
job: Tester


---
# 下面格式读到Python里会是个列表
- 灰蓝
- 0
- Tester


---
# 下面格式读到Python里是个list里包含dict
- name: 灰蓝
  age: 0
  job: Tester
- name: James
  age: 30


---
# 这个例子输出一个字典,其中value包括所有基本类型
str: "Hello World!"
int: 110
float: 3.141
boolean: true  # or false
None: null  # 也可以用 ~ 号来表示 null
# 使用strftime()方法来格式化时间参数
time: '2016-09-22 03:43:30'
date: '2016-09-22'


---
# 如果字符串没有空格或特殊字符,不需要加引号,但如果其中有空格或特殊字符,则需要加引号了
str: 灰蓝
str1: "Hello World"
str2: "Hello\nWorld"


---
# 这里要注意单引号和双引号的区别,单引号中的特殊字符转到Python会被转义,也就是到最后是原样输出了,双引号不会被Python转义,到最后是输出了特殊字符
str1: 'Hello\nWorld'
str2: "Hello\nWorld"


---
# & 和 * 用于引用
name: &name 灰蓝
tester: *name


---
# yaml使用!!进行强制转换
str: !!str 3.14
int: !!int "123"


---
- 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}


---

test_1_ip_api:
  url: http://httpbin.org/ip
  assert:
    ResponseType:
    - type
    - dict
    origin:
    - type
    - str
  method: get
  params: ''
  desc: "\u6D4B\u8BD5httpbin\u7684ip\u63A5\u53E3\u8FD4\u56DE\u6B63\u5E38"
---
name: dashuaihang
---
platformName: Android
platformVersion: '7.0'
deviceName: A5RNW18316011440
appPackage: com.tencent.mm
appActivity: .ui.LauncherUI
automationName: Uiautomator2
unicodeKeyboard: true
resetKeyboard: true
noReset: true
chromeOptions:
  androidProcess: com.tencent.mm:tools
---
- 1
- 2
- 3
- 4
- 5
- 6
--- "\u5929\u884C\u5065\u3002\u541B\u5B50\u4EE5\u81EA\u5F3A\u4E0D\u606F"
---
- 1
- 3
- 4
- 433
- 53

代码封装如下:
import os
from ruamel import yaml
import ruamel
import json
import warnings
import datetime

"""对yaml配置文件进行封装"""


class TestYaml(object):
    def __init__(self, file):
        """
        get target file
        """
        self.file = os.path.join(
            os.path.dirname(os.path.realpath(__file__)), file)

    def read_yaml_file(self):
        """
        to read yaml data
        """
        warnings.simplefilter('ignore', ruamel.yaml.error.UnsafeLoaderWarning)
        with open(self.file, 'r', encoding='utf-8') as f:
            result = yaml.load_all(f.read())
            for i in result:
                print()
                print("*****************************************")
                print()
                if isinstance(i, dict):
                    print(json.dumps(
                                        i,
                                        ensure_ascii=False,
                                        sort_keys=True,
                                        indent=4,
                                        separators=(',', ':')))
                else:
                    print(i)

    def write_yaml_file(self, *data):
        """
        write yaml data
        """
        try:
            with open(self.file, 'w', encoding='utf-8') as f:
                yaml.dump_all(
                    data, f,
                    Dumper=yaml.RoundTripDumper)  # Dumper=yaml.RoundTripDumper
                print("数据写入成功!")
        except Exception as e:
            print(f"发生错误{e}")
        finally:
            f.close()



if __name__ == "__main__":
    y = TestYaml("yaml_test.yml")
    """将参数写入对应的yaml配置文件中"""
    test_data1 = {
        "test_1_ip_api": {
            "url":
            "http://httpbin.org/ip",
            "assert": {
                "ResponseType": ["type", "dict"],
                "origin": ["type", "str"]
            },
            "method":
            "get",
            "params":
            "",
            "desc":
            "\u6d4b\u8bd5httpbin\u7684ip\u63a5\u53e3\u8fd4\u56de\u6b63\u5e38"
        }
    }
    test_data2 = {"name": "dashuaihang"}
    test_data3 = {
                    'platformName': 'Android',
                    'platformVersion': '7.0',
                    'deviceName': 'A5RNW18316011440',
                    'appPackage': 'com.tencent.mm',
                    'appActivity': '.ui.LauncherUI',
                    'automationName': 'Uiautomator2',
                    'unicodeKeyboard': True,
                    'resetKeyboard': True,
                    'noReset': True,
                    'chromeOptions': {'androidProcess': 'com.tencent.mm:tools'}
                }
    test_data4 = [1, 2, 3, 4, 5, 6]
    test_data5 = """天行健。君子以自强不息"""
    test_data6 = (1, 3,4,433,53)
    test_data7 = {
                    'str': 'Hello World!', 
                    'int': 110, 
                    'float': 3.141, 
                    'boolean': True, 
                    'time': datetime.datetime(2016, 9, 22, 3, 43, 30, 200000).strftime('%Y-%m-%d %H:%M:%S'), 
                    'date': datetime.date(2016, 9, 22).strftime('%Y-%m-%d')
                }
    
    """读取yaml配置文件内的参数"""
    y.read_yaml_file()
    """将参数写入对应的yaml配置文件中"""
    # y.write_yaml_file(test_data1, test_data2, test_data3, test_data4,test_data5, test_data6, test_data7)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容