[英]Python - Get empty key from yml file
我有很多结构相似但数据不同的 yaml 文件名。 我需要解析出选择性数据,并将其作为三列放入单个 csv (excel) 文件中。
但我面临一个空键问题,总是给我一个“KeyError:'port'”
我的 yaml 文件示例:
base:
server: 10.100.80.47
port: 3306
namePrefix: well
user: user1
password: kjj&%$
base:
server: 10.100.80.48
port:
namePrefix: done
user: user2
password: fhfh#$%
在第二个块中,我有一个空的“端口”,而我的脚本就卡在了这一点上。 我总是需要找到一个空键,它不会写任何东西。
from asyncio.windows_events import NULL
from queue import Empty
import yaml
import csv
import glob
yaml_file_names = glob.glob('./*.yaml')
rows_to_write = []
for i, each_yaml_file in enumerate(yaml_file_names):
print("Processing file {} of {} file name: {}".format(
i+1, len(yaml_file_names),each_yaml_file))
with open(each_yaml_file) as file:
data = yaml.safe_load(file)
for v in data:
if "port" in v == "":
data['base']['port'] = ""
rows_to_write.append([data['base']['server'],data['base']['port'],data['server']['host'],data['server']['contex']])
with open('output_csv_file.csv', 'w', newline='') as out:
csv_writer = csv.writer(out)
csv_writer.writerow(["server","port","hostname", "contextPath"])
csv_writer.writerows(rows_to_write)
print("Output file output_csv_file.csv created")
您正在尝试按索引访问密钥,例如
data['base']['port']
但是您想要的是使用 get 方法访问它,如下所示:
data['base'].get('port')
这样,如果键不存在,它将默认返回 None,您甚至可以通过将其作为第二个参数传递来将默认值更改为您想要的任何值。
在 PyYAML 中,空元素返回为None
,而不是空字符串。
if data['base']['port'] is None:
data['base']['port'] = ""
您的 yaml 文件无效。 在 yaml 文件中,只要您有一个密钥(如您的示例中的port:
:),您就必须提供一个值,您不能将其留空,并将 go 留到下一行。
这可能是您无法使用 python yaml 模块按预期解析文件的原因。 如果您是那些 yaml 文件的创建者,您真的需要在文件中放置一个密钥,例如port: None
如果您不想为端口提供值,或者更好的是您根本不提供任何端口密钥.
然后其他解决方案应该可以工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.