如何使用ruamel.yaml在YAML文件中指定浮点数的导出精度
如何用ruamel.yaml指定YAML导出时浮点数的精度?
ruamel.yaml本身没有提供直接配置浮点数小数位数的参数,但我们可以通过自定义浮点数的序列化逻辑(也就是注册自定义representer)来实现这个需求,具体操作如下:
步骤1:定义自定义浮点数格式化函数
这个函数会接收YAML实例和要序列化的浮点数,我们可以在这里指定要保留的小数位数,比如示例中保留4位:
def custom_float_representer(dumper, value): # 保留4位小数,你可以根据需求修改这里的数字 formatted = "{0:.4f}".format(value) # 如果格式化后末尾是.0000,转成整数形式(可选,不需要可以去掉这个判断) if formatted.endswith(".0000"): return dumper.represent_int(int(value)) return dumper.represent_scalar('tag:yaml.org,2002:float', formatted)
步骤2:将自定义函数注册到YAML实例
把上面的函数绑定到YAML实例的浮点数代表器上,如果你的数据里包含numpy的浮点类型(比如np.float64),也需要单独注册:
import sys import numpy as np from ruamel.yaml import YAML yaml = YAML() # 注册普通float类型的处理函数 yaml.representer.add_representer(float, custom_float_representer) # 如果处理numpy浮点数,需要额外注册对应的类型 yaml.representer.add_representer(np.float64, custom_float_representer)
步骤3:测试序列化效果
现在用修改后的YAML实例dump数据,就能得到指定精度的浮点数了:
my_arr = np.random.random((1, 3)) yaml.dump(my_arr.tolist(), sys.stdout)
示例输出(保留4位小数):
- - 0.1620 - 0.6259 - 0.4336
补充说明
- 如果你需要保留不同的小数位数,只需要修改格式化字符串里的
.4f部分,比如.2f就是保留2位小数 - 如果不需要把
2.0这类浮点数转成整数,可以去掉函数里的if formatted.endswith(".0000")判断逻辑 - 这种方式是全局生效的,所有浮点数都会被应用这个格式化规则
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

