#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
, поэтому вы используете исходное значение без одинарных кавычек.