【问题标题】:how can i dynamically keep the quotation marks from this config file?如何动态保留此配置文件中的引号?
【发布时间】:2026-01-09 16:15:01
【问题描述】:
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 yaml config pyyaml configparser


    【解决方案1】:

    这是 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)
    

    【讨论】:

      【解决方案2】:

      鉴于 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)
      

      需要注意的事项:应避免使用不带Loaderyaml.load,并将按照here 的说明和说明弃用。 另一件事是,要使这个确切的解决方案起作用,您需要 f 字符串。如果你在Python3.7+,我相信你很好。

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

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

      【讨论】:

        最近更新 更多