繁体   English   中英

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

[英]how can i dynamically keep the quotation marks from this config file?

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)

需要注意的一些事项:应避免在没有Loader的情况下使用yaml.load并将被弃用,如此处所述和解释 另一件事是,要使这个确切的解决方案起作用,您需要 f 字符串。 如果你在Python3.7+上,我相信你很好。

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

继续:如果您可以将值转换为 integer,它必须是(鉴于我解释的条件)一个日期,所以您使用单引号和最后的分号(或者分号应该在非常 output 中?) . 否则,在这种情况下,您将无法将其转换为 integer,从而引发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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM