ruamel.yaml类datetime格式值解析异常及判定标准咨询
ruamel.yaml 解析datetime/date类型的判断标准
ruamel.yaml的日期解析严格遵循YAML 1.2规范的时间戳标签规则,只有同时满足以下所有条件的标量值才会被解析为date/datetime对象:
- 格式完全匹配
YYYY-MM-DD(日期)或YYYY-MM-DDTHH:MM:SS[.ffffff][±HH:MM](带时间/时区的日期时间)规则:- 年份必须为4位及以上的正整数(你测试的
111-12-26年份只有3位,不满足规则,所以不会被解析为日期) - 月份为01-12区间的两位数字
- 日期为对应月份的合法日期,比如2月的日期不能超过28/29,4月不能超过30等
- 年份必须为4位及以上的正整数(你测试的
- 整个标量值没有多余的前后缀字符(你测试的
2000-12-26111末尾多了3位数字,不符合格式要求,所以直接作为字符串处理) - 标量值没有被单引号/双引号包裹,被引号包裹的值会直接作为字符串处理
报错原因
符合规则的日期值会被解析为datetime.date类型对象,Python内置的json.dumps默认不支持date、datetime类型的序列化,因此会抛出类型错误。
解决方法
方法1:禁用ruamel.yaml的日期解析功能
在初始化YAML实例后添加以下代码,覆盖默认的时间戳构造器,让所有符合日期格式的内容都作为字符串加载:
from ruamel.yaml.constructor import SafeConstructor yaml.constructor.add_constructor( 'tag:yaml.org,2002:timestamp', SafeConstructor.construct_scalar )
方法2:给json.dumps添加自定义序列化处理器
处理date、datetime类型的对象,转换为字符串后再序列化:
import datetime def json_default(obj): if isinstance(obj, (datetime.date, datetime.datetime)): return obj.isoformat() raise TypeError(f'Object of type {obj.__class__.__name__} is not JSON serializable') # 调用dumps时传入default参数 check = json.dumps(data, indent=4, ensure_ascii=False, default=json_default)
内容的提问来源于stack exchange,提问作者Puter.B166ER
相关产品推荐
相关产品推荐

