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