как я могу динамически сохранять кавычки в этом файле конфигурации?

#python #yaml #config #pyyaml #configparser

Вопрос:

 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
 

но теперь я потерял кавычки в исходной конфигурации для дат.. как я могу вернуть их обратно?

Ответ №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)
 

Некоторые вещи, которые следует отметить: yaml.load Loader следует избегать использования без a, и оно будет признано устаревшим, как указано и объяснено здесь.
Другое дело, что для работы этого точного решения вам нужны f-строки. Если ты в Python3.7 деле , я верю, что у тебя все хорошо.

Загвоздка здесь в том, чтобы использовать тот факт, что даты являются только числами и могут быть преобразованы в целое число, и что единственными полностью числовыми полями являются даты. Обратите внимание, что если это не всегда так, это решение приведет к неожиданным результатам.

Двигаясь дальше: если вы можете преобразовать значение в целое число, оно должно быть (с учетом условий, которые я объяснил) датой, поэтому вы используете одинарные кавычки и точку с запятой в конце (или точка с запятой должна быть в самом выводе?). В противном случае, в этом случае вы не сможете преобразовать его в целое число ValueError , поэтому вы используете исходное значение без одинарных кавычек.