yaml文件读写操作总结(全网最详细)

B站影视 电影资讯 2025-10-24 12:45 3

摘要:import yamlimport os# 您的三个方法def write_yml_a(filename, data): with open(filename, mode='a+', encoding="utf-8") as f: yaml.dump(data

下面是yaml文件的内容:

api: base_url: "https://www.baidu.com" timeout: 10test_data: posts: - userId: 1 title: "测试标题" body: "这是一个测试内容" - userId: 2 title: "另一个测试" body: "这是另一个测试内容"

操作yaml文件内容的读、写、清空等方法如下:

import yamlimport os# 您的三个方法def write_yml_a(filename, data): with open(filename, mode='a+', encoding="utf-8") as f: yaml.dump(data, f)def read_yml(filename, key): with open(filename, mode='r', encoding="utf-8") as f: data = yaml.safe_load(f) return data[key]def clear_yml(filename): with open(filename, mode='w', encoding="utf-8") as f: f.truncate(0)

下面是具体的操作过程,已经返回结果:

filename = "test_config.yml" # 初始YAML内容 initial_content = { 'api': { 'base_url': "https://www.baidu.com", 'timeout': 10 }, 'test_data': { 'posts': [ {'userId': 1, 'title': "测试标题", 'body': "这是一个测试内容"}, {'userId': 2, 'title': "另一个测试", 'body': "这是另一个测试内容"} ] } } print("=" * 50) print("YAML文件操作演示") print("=" * 50) # 1. 清空文件(确保从干净状态开始) clear_yml(filename) print("1. 已清空文件内容")输出结果YAML文件操作演示1. 已清空文件内容 # 2. 写入初始内容 write_yml_a(filename, initial_content) print("2. 已写入初始内容")输出结果:2. 已写入初始内容 # 3. 读取内容 print("\n3. 读取文件内容:") try: api_data = read_yml(filename, 'api') test_data = read_yml(filename, 'test_data') print("API配置:", api_data) print("测试数据:", test_data) except Exception as e: print(f"读取错误: {e}")输出结果:3. 读取文件内容:API配置: {'base_url': 'https://www.baidu.com', 'timeout': 10}测试数据: {'posts': [{'userId': 1, 'title': '测试标题', 'body': '这是一个测试内容'}, {'userId': 2, 'title': '另一个测试', 'body': '这是另一个测试内容 # 4. 追加新数据 new_data = { 'database': { 'host': 'localhost', 'port': 3306, 'name': 'test_db' } } write_yml_a(filename, new_data) print("\n4. 已追加数据库配置")输出结果:4. 已追加数据库配置 # 5. 再次读取查看完整内容 print("\n5. 查看完整文件内容:") with open(filename, 'r', encoding='utf-8') as f: content = f.read print(content)输出结果:5. 查看完整文件内容:api: base_url: https://www.baidu.com timeout: 10test_data: posts: - body: 这是一个测试内容 title: 测试标题 userId: 1 - body: 这是另一个测试内容 title: 另一个测试 userId: 2database: host: localhost name: test_db port: 3306 # 6. 演示读取特定数据 print("\n6. 读取特定数据:") try: # 读取posts数据 posts_data = read_yml(filename, 'posts') print("Posts数据:", posts_data) except Exception as e: print(f"读取posts错误: {e}") # 尝试通过test_data读取 try: test_data = read_yml(filename, 'test_data') posts_data = test_data['posts'] print("Posts数据:", posts_data) except Exception as e2: print(f"通过test_data读取错误: {e2}")输出结果:6. 读取特定数据:读取posts错误: 'posts'Posts数据: [{'body': '这是一个测试内容', 'title': '测试标题', 'userId': 1}, {'body': '这是另一个测试内容', 'title': '另一个测试', 'userId': 2 # 7. 清空并重新写入结构化数据 print("\n7. 重新写入结构化数据:") clear_yml(filename) # 重新写入完整结构 structured_data = { 'api': initial_content['api'], 'test_data': initial_content['test_data'], 'environment': { 'name': 'test', 'version': '1.0.0' } } write_yml_a(filename, structured_data) # 读取验证 with open(filename, 'r', encoding='utf-8') as f: final_content = yaml.safe_load(f) print("最终文件内容:") print(yaml.dump(final_content, default_flow_style=False, allow_unicode=True))输出结果:7. 重新写入结构化数据:最终文件内容:api: base_url: https://www.baidu.com timeout: 10environment: name: test version: 1.0.0test_data: posts: - body: 这是一个测试内容 title: 测试标题 userId: 1 - body: 这是另一个测试内容 title: 另一个测试 userId: 2 # 8. 清理文件 if os.path.exists(filename): os.remove(filename) print(f"\n8. 已清理测试文件: {filename}")输出结果:8. 已清理测试文件: test_config.ymlimport yamldef write_yml(filename, data, mode='w'): """改进的写入方法,支持覆盖和追加模式""" with open(filename, mode=mode, encoding="utf-8") as f: yaml.dump(data, f, default_flow_style=False, allow_unicode=True)def read_yml_full(filename): """读取整个YAML文件""" with open(filename, mode='r', encoding="utf-8") as f: return yaml.safe_load(f)def read_yml(filename, key=None): """安全读取,支持读取整个文件或特定键""" with open(filename, mode='r', encoding="utf-8") as f: data = yaml.safe_load(f) if key is None: return data return data.get(key)def update_yml(filename, new_data): """更新YAML文件,合并数据""" existing_data = read_yml_full(filename) or {} existing_data.update(new_data) write_yml(filename, existing_data)# 使用改进的方法def improved_demo: filename = "improved_config.yml" # 初始数据 initial_data = { 'api': { 'base_url': "https://www.baidu.com", 'timeout': 10 }, 'test_data': { 'posts': [ {'userId': 1, 'title': "测试标题", 'body': "这是一个测试内容"}, {'userId': 2, 'title': "另一个测试", 'body': "这是另一个测试内容"} ] } } # 写入初始数据 write_yml(filename, initial_data) print("初始文件内容:") print(yaml.dump(read_yml_full(filename), default_flow_style=False, allow_unicode=True)) # 更新数据 new_config = { 'database': { 'host': 'localhost', 'port': 3306 } } update_yml(filename, new_config) print("更新后的文件内容:") print(yaml.dump(read_yml_full(filename), default_flow_style=False, allow_unicode=True)) # 读取特定数据 api_config = read_yml(filename, 'api') print("API配置:", api_config)improved_demo避免直接追加写入,这会导致YAML结构混乱提供更新方法,保持文件结构清晰改进读取方法,支持读取整个文件或特定键使用default_flow_style=False保持YAML格式美观

来源:互联网AI工程师

相关推荐