Files
WebAutoTest/utils/file_processors/toml_processor.py
CNWei 92d06dd9cf init: 初始化项目
- 创建了基本的项目结构
- 添加了 .gitignore 文件
- 配置了基本的开发环境
- 添加清华镜像源
- 设置了基础的文件夹和文件(如 commons, utils, POM, pytest.ini)

项目说明:
- [项目名称]:Web自动化测试
- [项目描述]:基于pytest,selenium的自动化测试工具
- [开发环境]:Python
2025-04-14 23:05:39 +08:00

110 lines
3.7 KiB
Python

#!/usr/bin/env python
# coding=utf-8
"""
@author: CNWei
@Software: PyCharm
@contact: t6i888@163.com
@file: file_processing
@date: 2025/4/8 21:22
@desc:
"""
from pathlib import Path
from tomlkit import parse, dumps
from tomlkit.toml_file import TOMLFile
import logging
from typing import Union
from dataclasses import dataclass, asdict, field
from pathlib import Path
import tomlkit
from utils.file_processors.base import BaseFileProcessor
logger = logging.getLogger(__name__)
class TomlProcessor(BaseFileProcessor, dict):
"""
用于处理 YAML 文件的类,继承自 dict。
提供了从文件加载、保存到文件、转换为字符串和从字符串转换的功能,
并可以直接像字典一样访问 YAML 数据。
"""
def __init__(self, filepath: Union[str, Path], data: Union[dict, None] = None):
"""
初始化 YamlFile 对象。
Args:
filepath: YAML 文件的路径 (可以是字符串或 pathlib.Path 对象).
data: 可选的初始数据字典。如果提供,则用该字典初始化 YamlFile。
如果不提供,则尝试从 filepath 加载数据。
"""
super().__init__() # 初始化父类 dict
self.filepath: Path = Path(filepath) # 确保 filepath 是 Path 对象
if data is not None:
self.update(data) # 如果提供了初始数据,则更新字典
else:
self.load() # 否则,尝试从文件加载
def load(self) -> None:
self.clear() # 清空现有数据
if self.filepath.exists():
try:
with open(self.filepath, 'r', encoding='utf-8') as f:
result = tomlkit.parse(f.read()) or {}
# print(result)
self.update(result)
except Exception as e:
logger.error(f"加载 TOML 文件 {self.filepath} 时出错: {e}")
else:
logger.warning(f"文件 {self.filepath} 不存在, 字典保持为空.")
@staticmethod
def to_string(data: dict) -> str:
try:
return tomlkit.dumps(
dict(data), # 使用dict转换为标准的字典
sort_keys=False
)
except TypeError as e:
logger.error(f"将数据转换为 TOML 字符串时出错: {e}")
return ""
@staticmethod
def to_dict(data: str) -> Union[None, dict]:
try:
loaded_data = tomlkit.loads(data) or {}
return loaded_data
except Exception as e:
logger.error(f"将 TOML 字符串转换为字典时出错: {e}")
def save(self, new_filepath: Union[str, Path, None] = None):
filepath = Path(new_filepath) if new_filepath else self.filepath
try:
with open(filepath, "w", encoding="utf-8") as f:
tomlkit.dump(
dict(self), # 使用dict转换为标准的字典
fp=f,
sort_keys=False,
)
except (TypeError, OSError) as e:
logger.error(f"保存 TOML 文件 {filepath} 时出错: {e}")
if __name__ == '__main__':
...
toml_path =r'E:\PyP\WebAutoTest\data\var.toml'
toml_file = TomlProcessor(toml_path)
print(toml_file)
print(type(toml_file))
print(toml_file.to_string(toml_file))
print(toml_file.to_dict(toml_file.to_string(toml_file)))
print(toml_file.to_dict(toml_file.to_string(toml_file)))
toml_file.to_dict(toml_file.to_string(toml_file))
# toml_file.save()
print(toml_file.to_string(
{'用例ID': None, '内容': '打开浏览器', '标记': 'browser', '参数': 'edge', '_BlankField': [None, None]}))