python yaml 文件解析及str、repr函数的说明

记录说明 yaml 文件解析的方法及str、repr函数的区别

1. yaml 文件解析

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')

2. str() 和 repr() 函数的区别说明

Python 中将某一类型的 变量 或者 常量 转换为字符串对象通常有两种方法,str() 或者 repr().

  • 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对象的实例

相关推荐