微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何动态保留此配置文件中的引号?

如何解决如何动态保留此配置文件中的引号?

data: 
    START_DT: '202001'
    END_DT: '202104'
    schema: products 

我有上面的 YAML 文件

我希望能够使用它,以便我得到:

set START_DT='202001';
set END_DT='202104';
set schema = products 

请注意日期在引号中,而产品不在引号中。

with open("data.yml","r") as ymlfile:
    cfg = yaml.load(ymlfile) 
lines=[]
for k,v in cfg['data'].items():
     print("SET" +' '+  k+'='+ v)
     var = ("SET" +' '+  k+'='+ v)
     lines.append(var)

印刷品:

SET START_DT=201901
SET END_DT=202104 
SET SCHEMA=products

但是现在我丢失了原始配置中日期的引号..我怎样才能找回这些?

解决方法

考虑到 Python 语法的灵活性,您可能可以在一行或类似的代码中找到一种方法,但我相信有一种更简洁的方法,我将在下面展示。

import yaml


with open("data.yaml",'r') as file_:
    config = yaml.safe_load(file_)

lines = []
for key,value in config['data'].items():
    try:
        out = f"SET {key}='{int(value)}';"
    except ValueError:
        out = f"SET {key}={value}"
    print(out)
    lines.append(out)

需要注意的一些事项:应避免使用没有 yaml.loadLoader,并且将被弃用,如声明和解释的 here。 另一件事是,要使这个确切的解决方案起作用,您需要 f 字符串。如果你在 Python3.7+,我相信你很好。

这里的问题是利用这样一个事实,即日期只是数字并且可以转换为整数,并且唯一完全数字的字段是日期。 请注意,如果情况并非总是如此,此解决方案将呈现意外的输出。

继续:如果您可以将值转换为整数,则它必须是(根据我解释的条件)日期,因此您可以使用单引号和最后的分号(或者分号应该在非常输出?)。否则,在这种情况下,您将无法将其转换为整数,提高 ValueError,您将使用不带单引号的原始值。

,

这是 YAML 规范的一部分。任何看起来不像任何其他类型或被引用的东西都被解释为字符串。

如果您希望引用特定键,则在打印它们时,您可以维护一个列表,列出应该对哪些键进行引用。

QUOTED_KEYS = ["START_DT","END_DT"]

with open("data.yml","r") as ymlfile:
    cfg = yaml.load(ymlfile) 

lines = []
for k,v in cfg['data'].items():
    if k in QUOTED_KEYS:
        v = f"'{v}'"

    s = f"SET {k}={v}"
    print(s)
    lines.append(s)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。