我有一个python程序,它会被nagios检查失败触发并调用一个工程师。作为其中的一部分,它使用作为文件名的一部分失败的服务的名称保存状态文件。这很好,除了一些服务包含斜杠(例如,检查NFS挂载点是否存在,服务只是以挂载点命名),并且当Python尝试创建具有这个名称的文件时,它将名称解释为目录树(树的某些部分不存在)并且失败。
显然,这里有一些方法(例如,我可以停止在文件路径中使用服务名称),但是我现在非常喜欢它的设计,因为我可以知道一个状态文件是否已经存在于给定的服务中,而不需要读取目录中的每个状态文件。有没有办法写一个包含路径分隔符的文件名?
我想要的是:

service_name = '/data/servername'
filename = escape_service_name(service_name)
statepath = os.join(state_dir, filename)
statefile = open(statepath, "w")
# Write state file details here

……但我看不出怎么逃过刀口,所以这行得通。

最佳答案

不能直接使用带有路径分隔符的文件名。我在这些情况下使用百分比编码:

import urllib

# outputs "foo%2Fbar"
print urllib.quote('foo/bar', '')

这种解决方案的好处是百分比编码是完全可逆的,因此您可以完美地重新构建您的文件名。如果您只是用类似于/的内容替换_,您将无法知道原始字符是/还是_。使用百分比编码,您可以,因为它也会转义%符号。

10-06 10:03
查看更多