sschencn 2020-02-23
记录说明 yaml 文件解析的方法及str、repr函数的区别
config.yml
site_name: AJPy pages: - Introduction: index.md - AJP overview: ajp.md theme: readthedocs code: 中文
解析yaml 文件
import yaml import os class OperateYaml(object): """ 操作yaml 文件 """ def __init__(self): pass def load_yaml_file(self, yaml_file_path): """ 加载 yaml 文件 :param yaml_file_path: :return: """ if not os.path.exists(yaml_file_path): print 'yaml file is not exist.' return if not os.path.splitext(yaml_file_path)[-1] == '.yml': print 'input file is not a yaml file' return with open(yaml_file_path) as fp: result = yaml.load(fp) # TODO 若yml 文件中含有中文, 使用以下方法进行转换 result = repr(result).decode('unicode_escape') return result def write_dict_to_yaml_file(self, a_dict, output_path): """ 将字典内容序列化到 yaml 文件中 :param a_dict: 待序列化的字典 :param output_path: 输出文件路径 :return: """ if not isinstance(a_dict, dict): print 'must be input a dict.' return if not os.path.exists(output_path): os.makedirs(output_path) output_file_path = os.path.join(output_path, 'temp.yml') # 使用'a' ,当文件不存在时,创建一个新文件 with open(output_file_path, 'a') as fp: yaml.dump(a_dict, fp, indent=4) if __name__ == '__main__': oy = OperateYaml() # {'theme': 'readthedocs', 'code': u'中文', 'site_name': 'AJPy', 'pages': [{'Introduction': 'index.md'}, {'AJP overview': 'ajp.md'}]} print oy.load_yaml_file('config.yml') a_dict = {'topic': 'python', 'foo': ['foo1', 'foo2', 'foo3'], 'bar': {'bar1': 'value1', 'bar2': 'value2'}} oy.write_dict_to_yaml_file(a_dict, './result')
Python 中将某一类型的 变量 或者 常量 转换为字符串对象通常有两种方法,str() 或者 repr().
str() 和 repr() 两个函数的 相同点 在于,都可以将任意的值转化为字符串
函数str()将其转化成为适于人阅读的前端样式文本, 输出追求可读性,输出格式要便于理解,适合用于输出内容到用户终端
repr(object)就是原本未处理的用于编译器阅读的后台底层代码, 输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用
>>> print(str('123')) 123 >>> print(str(123)) 123 >>> print(repr('123')) '123' >>> print(repr(123)) 123
当把一个字符串传给str()函数再打印到终端的时候,输出的字符不带引号 而将一个字符串传给repr()函数再打印到终端的时候,输出的字符带有引号
>>> from datetime import datetime >>> now = datetime.now() >>> print(str(now)) 2020-02-22 15:41:33.012917 >>> print(repr(now)) datetime.datetime(2020, 2, 22, 15, 41, 33, 12917)
通过str()的输出结果能知道 now 实例的内容,但是却丢失了 now 实例的数据类型信息。 通过repr()的输出结果不仅能获得 now 实例的内容,还能知道 now 是datetime.datetime对象的实例