如何解决如何动态保留此配置文件中的引号?
data:
START_DT: '202001'
END_DT: '202104'
schema: products
我希望能够使用它,以便我得到:
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.load
的 Loader
,并且将被弃用,如声明和解释的 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 举报,一经查实,本站将立刻删除。