Yaml :发现意外的流结束



我写了一个python代码来生成一个YAML文件(称为targets.yml(,该文件由一个名为prometheus的流行监视应用程序读取。普罗米修斯成功读取了 YAML 文件及其内容,但它也在日志中抛出错误,如下所示。

level=error msg="Error reading file "/var/targets/targets.yml": yaml: 
line 218: found unexpected end of stream" source="file.go:199" 

我无法摆脱此错误,尽管我适当地关闭了 YAML 文件,下面是代码:-

while True:
create()
with open('/var/targets/targets.yml', 'w') as output:
print "opened the file to write"
i=0
for item in result:
if(item != None and item['status'] == "ACTIVE"):
print item['domains']['partner']
print item['status']
output.write("nn")
output.write("- targets: ['" + "https://" + item["domains"]["agency"] + "']n")
output.write("  labels:n")
output.write("    alias: " + item["alias"])
foo=item["name"]
#print foo
if isinstance(foo,basestring):
foo=foo.encode('utf8')
else:
foo=unicode(foo).encode('utf8')
output.close()
print("Waiting for 300 seconds, before relooping")
time.sleep(100)

此外,我认为我的文件扩展名没有任何区别。有人可以建议吗?

with open('/var/targets/targets.yml', 'w') as output:

这是你问题的一部分,这不是原子的。您需要创建一个临时文件,然后将其移动到适当的位置。

我还建议使用 yaml 库,而不是手动创建它。

在我的情况下,报价的开盘价和收盘价不匹配", 但是错误在另一个地方,然后是错误报告的行。

编辑:正如布莱恩 - 巴西指出的那样,这不会解决问题,但可能会缓解症状。因此,只有当你绝对无法实现布莱恩-巴西的答案时,才应用这个答案。

详细阐述一下brian-brazil的答案:此操作不是原子的,这意味着另一个进程(对python脚本一无所知(可以在完成写入之前读取您的YAML文件。

如果直接写入该文件绝对重要,则可能需要禁用缓冲 (doc( 并一次写入整个 YAML 文档。你可以通过将你当前正在单独执行的所有"写入"收集到一个字符串中,然后一次写入所有这些来做到这一点。

而不是

output.write("nn")
output.write("- targets: ['" + "https://" + item["domains"]["agency"] + "']n")
output.write("  labels:n")
output.write("    alias: " + item["alias"])

你会做这样的事情:

yaml = ""
yaml += "nn"
yaml += "- targets: ['" + "https://" + item["domains"]["agency"] + "']n"
yaml += "  labels:n"
yaml += "    alias: " + item["alias"]
output.write(yaml)

这不是最有效的方法,但为了说明起见,它应该没问题。

最新更新