话不多说,直接上代码。
file_reader.py # 写一个常用的读取Yaml文件的类。封装好,方便后续使用。
import os
import yaml # 通过 pip install pyyaml 得到
class YamlReader():
def __init__(self, yamlf):
if os.path.exists(yamlf):
self.yamlf = yamlf
else:
raise FileExistsError("文件不存在!")
self._data = None # 私有属性
@property
def data(self):
# 如果是第一次调用data,读取yaml文档,否则返回之前保存的数据
if not self._data: # 如果不存在,则读取.
with open(self.yamlf, 'rb') as f:
self._data = list(yaml.safe_load_all(f)) # load返回的是一个生成器,需要list转换
return self._data[0]
yaml_demo.yaml # 文件的内容如下,作为一个示例文本。
Yaml常见数据格式:
# 这是一个yaml文件示例文档.
text1: 字符串 # 直接写,是字符串(键值对的字符串),但是数字的话,直接是整型.
person: # person:[{"name":"张三"},{"age":18}]
- name: 张三
- age: 18 # 数字的整型
- gender: 男
- favorite: [ '喝酒','抽烟','打游戏' ] # 这里能得到一个列表.{'favorite': ['喝酒', '抽烟', '打游戏']}
not_set1: { 'A','B','C' } # 并不能直接得到一个集合,因为已经红框标注了.'set1': {'A': None, 'B': None, 'C': None}
set2: !!set { 'A','B','C' } # 强制转换为集合。这样就能得到集合类型了. 'set2': {'C', 'B', 'A'}}
num_str: !!str 15 # 强制转换为字符串。强制将数字转化为字符串。
str_num: !!int '1991' # 字符串强制转换为数字。
boolean: !!bool 'true' # 强制转换为布尔值
str_float: !!float '19.2345' # 强制转换为浮点型。
#str_bin: !!binary 'v' # 强制转换为二进制
dic1: { 'A': 1,"B": 2 } # 'dic1': {'A': 1, 'B': 2}} 能得到一个字典.<class 'dict'>
dic2: # 这也是一个字典.
A: 2
B: 3
not_tuple1: (1,2,3) # 'tuple1': '(1,2,3)' 并不能直接得到一个元组.
not_tuple2: # 'tuple2': '1 2 3',也不能直接拿到一个元组.
1
2
3
#tuple3: !!tuple 1,2,3 # 非法写法
A: # 不能直接写A不带冒号,会报错。 写了冒号不写值,是一个没有值的键值对。
--- # 多文本了,读取方式要变,不然只能读取到这个上面的信息.
set3: 1
--- # 多文本2
data5: 2
1: 2
read_yaml_demo.py # 读取yaml文件的返回数据。
全部数据:{'text1': '字符串', 'person': [{'name': '张三'}, {'age': 18}, {'gender': '男'}, {'favorite': ['喝酒', '抽烟', '打游戏']}],
'not_set1': {'A': None, 'B': None, 'C': None}, 'set2': {'B', 'C', 'A'}, 'num_str': '15', 'str_num': 1991, 'boolean': True,
'str_float': 19.2345, 'dic1': {'A': 1, 'B': 2}, 'dic2': {'A': 2, 'B': 3}, 'not_tuple1': '(1,2,3)', 'not_tuple2': '1 2 3', 'A': None}
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
type:<class 'str'> text1: 字符串
type:<class 'list'> person: [{'name': '张三'}, {'age': 18}, {'gender': '男'}, {'favorite': ['喝酒', '抽烟', '打游戏']}]
type:<class 'dict'> not_set1: {'A': None, 'B': None, 'C': None}
type:<class 'set'> set2: {'B', 'C', 'A'}
type:<class 'str'> num_str: 15
type:<class 'int'> str_num: 1991
type:<class 'bool'> boolean: True
type:<class 'float'> str_float: 19.2345
type:<class 'dict'> dic1: {'A': 1, 'B': 2}
type:<class 'dict'> dic2: {'A': 2, 'B': 3}
type:<class 'str'> not_tuple1: (1,2,3)
type:<class 'str'> not_tuple2: 1 2 3
type:<class 'NoneType'> A: None