Python读写yaml文件

这篇具有很好参考价值的文章主要介绍了Python读写yaml文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


YAML 是一种常见的标记性语言,常用于配置文件。本文就使用Python 对yaml文件的读写展开讨论。

yaml 语法请查看:https://blog.csdn.net/yuelai_217/article/details/130582142

一、读取yaml文件

1.1、读取单组数据

Python 读取yaml常见的有两种方式,一种是使用pyyaml,另一种是ruamel.yaml

1.1.1、pyyaml
pip install pyyaml

test.yaml如下:

name: zhangsan
age: 45

读取文件如下:

# coding=utf-8

import yaml


def read_yaml(file_path):
    with open(file_path, "r") as f:
        return yaml.safe_load(f)


data = read_yaml("test.yaml")
print(data)  # {'age': 45, 'name': 'zhangsan'}
1.1.2、ruamel.yaml
pip install ruamel.yaml

同样解析test.yaml,如下:

from ruamel import yaml


with open("test.yaml") as f:
    config = yaml.load(f, Loader=yaml.RoundTripLoader)

print config  # ordereddict([('name', 'zhangsan'), ('age', 45)])
print config["name"]

1.2、读取多组数据

修改test.yaml如下

name: zhangsan
age: 45
---
name: lisi
age: 25
---
name: wangwu
age: 33
# coding=utf-8

import yaml

def read_yaml(file_path):
    with open(file_path, "r") as f:
        return yaml.safe_load_all(f.read())


data = read_yaml("test.yaml")
print(data)  

for d in data:
    print d

# 结果如下
<generator object load_all at 0x102d0c9b0>
{'age': 45, 'name': 'zhangsan'}
{'age': 25, 'name': 'lisi'}
{'age': 33, 'name': 'wangwu'}

获取列表式结果

# coding=utf-8

import yaml

def read_yaml(file_path):
    with open(file_path, "r") as f:
        return list(yaml.safe_load_all(f.read()))


data = read_yaml("test.yaml")
print(data)  

# 结果如下
[{'age': 45, 'name': 'zhangsan'}, {'age': 25, 'name': 'lisi'}, {'age': 33, 'name': 'wangwu'}]

使用ruamel.yamlPyYAML在处理多组数据时结果一致

二、写入数据

2.1、写入单组数据

使用 safe_dump写入单组数据

# coding=utf-8

import yaml
import os


def write_date_to_yaml(date):
    file_path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'test.yaml'))
    with open(file_path, 'w') as f:
        yaml.safe_dump(date, f, allow_unicode=True)


info = {"name": "小红", "age": 18}
write_date_to_yaml(info)


# test.yaml 如下
age: 18
name: 小红

# 文件被重写,原有内容丢失,修改'w'为'a',报错,因为没有插入多组数据分隔符
name: zhangsan
age: 45
---
name: lisi
age: 25
---
name: wangwu
age: 33
age: 18  # 缺少分隔符 ---
name: 小红

2.2、追加多组数据

使用 safe_dump_all写入多组数据

import yaml
# from ruamel import yaml
import os

info = {"name": "小红", "age": 18}
info1 = {"name": "小蓝", "age": 19}


def write_date_to_yaml():
    file_path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'test.yaml'))
    with open(file_path, 'a') as f:
        yaml.safe_dump_all([info1, info], f, allow_unicode=True, default_flow_style=False)


write_date_to_yaml()

# 结果如下:
age: 45
name: zhangsan
---
age: 25
name: lisi
---
age: 33
name: wangwu
                 # 此处没有分隔符,导致错误
age: 19
name: 小蓝
---
age: 18
name: 小红

手动添加---结果如下:

import yaml
# from ruamel import yaml
import os

info = {"name": "小红", "age": 18}
info1 = {"name": "小蓝", "age": 19}


def write_date_to_yaml():
    file_path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'test.yaml'))
    with open(file_path, 'a') as f:
        yaml.safe_dump_all(['---', info1, info], f, allow_unicode=True, default_flow_style=False)


write_date_to_yaml()

# 结果如下:
age: 45
name: zhangsan
---
age: 25
name: lisi
---
age: 33
name: wangwu

'---'   # 多出此行,是错误的
---
age: 19
name: 小蓝
---
age: 18
name: 小红

最终解决办法如下,采用先读取数据,修改数据后统一写入的办法,此处将读取的数据以列表形式展示,如果是单组数据,直接使用字典的update()方法更新。

# coding=utf-8
import yaml
import os

info = {"name": "小红", "age": 18}
info1 = {"name": "小蓝", "age": 19}


def update_yaml():
    file_path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'test.yaml'))
    with open(file_path, 'r') as f:
        data = list(yaml.safe_load_all(f))
        data.append(info)
        data.append(info1)

        # data.update(info)
        with open(file_path, 'w') as fl:
            yaml.safe_dump_all(data, fl, encoding='utf-8')


# sign = "---"
update_yaml()

# 结果如下
age: 45
name: zhangsan
---
age: 25
name: lisi
---
age: 33
name: wangwu
---
age: 18
name: "\u5C0F\u7EA2"
---
age: 19
name: "\u5C0F\u84DD"

汉字没有正常显示,需要使用中文unicode码写入allow_unicode=True,修改为:

yaml.safe_dump_all(data, fl, allow_unicode=True)

# 结果如下
age: 45
name: zhangsan
---
age: 25
name: lisi
---
age: 33
name: wangwu
---
age: 18
name: 小红
---
age: 19
name: 小蓝

附:ruamel.yaml和PyYAML区别

ruamel.yamlPyYAML都是用于处理YAML格式的Python库,但它们之间有一些区别:

  • 安装方式:ruamel.yaml可以通过pip直接安装,而PyYAML需要在安装前先安装C编译器。

  • YAML标准支持性:ruamel.yaml支持最新的YAML 1.2标准,而PyYAML只支持旧的YAML 1.1。

  • 兼容性:ruamel.yaml与PyYAML的兼容性较低,因为它们使用不同的解析器和加载器,所以在某些情况下,ruamel.yaml不能正确地解析PyYAML生成的YAML文件。

  • 性能:ruamel.yaml的解析速度要比PyYAML快,特别是在处理大型YAML文件时。

  • 功能:ruamel.yaml提供了更多的功能,如可以保留注释、顺序等YAML文件的元数据信息,支持更多的Python数据类型和格式。

总的来说,如果需要处理较新的YAML标准或需要更高的性能和更多的功能,可以选择ruamel.yaml。如果只是简单地需求解析YAML文件,PyYAML是一个更简单的选择。

附:yaml.safe_load()和yaml.load()区别

在PyYAML库中,yaml.safe_load()和yaml.load()都可以用来解析YAML文件,但是有一些区别:

  • 安全性: yaml.safe_load()可以安全地从YAML文档中加载数据,而不会执行任何可疑的Python代码。这使得它非常适合处理来自不受信任的源的YAML文档。yaml.load()则不提供此安全功能,因此不建议使用它来加载未知或不受信任的YAML文档。

  • 数据类型:yaml.safe_load()只能加载基本的Python数据类型,例如字符串、数字、列表和字典等。而yaml.load()可以加载任何Python对象,包括自定义类实例和Python内置类型的子类。

  • 执行Python代码:yaml.load()可以执行YAML文档中嵌入的Python代码。这使得它可以用于一些高级用例,例如将Python代码编译为YAML文档,并在不同的Python环境中加载它们。但是,由于安全风险,不建议在加载未知或不受信任的YAML文档时使用此功能。

因此,在处理未知或不受信任的YAML文档时,推荐使用yaml.safe_load()来保证安全性。

参考文档:

1、https://www.cnblogs.com/yxfeng/p/10396288.html

2、https://www.cnblogs.com/hhaostudy/p/16104098.html文章来源地址https://www.toymoban.com/news/detail-860453.html

到了这里,关于Python读写yaml文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python 模块和包

    Python是一种简单易学、功能强大的编程语言,而其模块和包的概念更是为我们提供了一种有效管理和组织代码的方式。模块是Python程序的基本组成单元,它是一个包含函数、变量和类的文件。而包则是由多个模块组成的一个目录,可以帮助我们更好地组织和复用代码。 在本系

    2024年02月16日
    浏览(26)
  • 7 Python的模块和包

    概述         在上一节,我们介绍了Python的异常处理,包括:异常、异常处理、抛出异常、用户自定义异常等内容。在这一节中,我们将介绍Python的模块和包。Python的模块(Module)和包(Package)是Python的两个主要概念,它们都是用来组织和封装代码的机制。 什么是模块

    2024年02月11日
    浏览(29)
  • Python学习之路-模块和包

    简介 模块是 Python 程序架构的一个核心概念。每一个以扩展名 py 结尾的 Python 源代码文件都是一个模块,模块名同样也是一个标识符,需要符合标识符的命名规则。在模块中定义的全局变量、函数、类都是提供给外界直接使用的工具。模块就好比是工具包,要想使用这个工具

    2024年02月01日
    浏览(31)
  • Python标准库(Python自带的模块和包)

            “自带电池”指python语言的标准库,因为它包含了丰富的功能和工具,几乎可以满足大部分的开发需求,就像一个内置电池一样,所以python标准库被称之为“自带电池”。 python中的os模块提供了丰富的与操作系统交互的函数。开发人员可以通过os模块提供的函数对

    2024年02月05日
    浏览(28)
  • Python实验五 函数、模块和包

    2024年02月10日
    浏览(44)
  • CMake:检测python模块和包

    上一篇,我们基本了解了如何去检测 python 的解释器和 python 库。通常,代码是依赖于特定的 python 模块,无论是 python 工具、嵌入 python 的程序,还是扩展 python 的库。例如, numpy 包。依赖于 python 模块或包的项目中,确定满足对这些 python 模块的依赖非常重要。 项目地址:

    2024年02月13日
    浏览(22)
  • Python的模块(module)和包(package)

    Python 的模块(module) 和包(package) 概述 在Python中,简单地说,模块(Module)一般是单个python文件;包(package)由分层模块(Module)构成——相关目录里的模块构成。Python中的库(library)是参考其它编程语言的说法,既可以是一个模块也可以是一个包,换言之是对模块或包的通

    2024年02月09日
    浏览(70)
  • Python模块和包:sys模块、os模块和变量函数的使用

    模块化指将一个完整的程序分解为一个一个小的模块,通过将模块组合,来搭建出一个完整的程序。模块化具有方便开发、维护和复用的优点。在Python中,每个py文件就是一个模块。 在一个模块中引入外部模块有两种方式: import 模块名 和 import 模块名 as 模块别名 。后者可以

    2024年02月08日
    浏览(27)
  • 【100天精通python】Day15:python 第三方模块和包,模块如何以主程序形式执行

    目录 1 常用的第三方模块 2. 第三方模块的安装和使用 2.1 安装第三方模块:

    2024年02月15日
    浏览(32)
  • “from ruamel.yaml import YAMLModuleNotFoundError: No module named ‘ruamel‘”报错,安装ruamel包的解决方法

    问题: 尝试pip install ruamal.yaml,显示Requirement already satisfied: ruamel.yaml in c:usersmacanaconda3libsite-packages (0.15.87),说明已经有了 解决方法:  conda list查看环境的包 发现没有叫ruamal.yaml,只有一个ruamal_yaml 找到软件的路径(报错里有说是在哪个python文件下出错了),打开python文

    2024年02月13日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包