我有一个python程序被Nagios检查失败引发并召唤工程师。作为其中的一部分,它使用作为文件名的一部分失败的服务的名称来保存状态文件。这很好,除了一些服务包含斜杠(例如,用于检查是否存在NFS挂载点,服务只是在挂载点之后命名)以及当python尝试使用此名称创建文件时,它会解释将name命名为目录树(树的某些部分不存在)并失败。
显然有很多方法可以解决这个问题(例如,我可以停止在文件路径中使用服务名称),但我非常喜欢它目前设计的方式,因为我可以判断某个服务的状态文件是否已存在无需读取目录中的每个状态文件。有什么办法可以编写包含路径分隔符的文件名吗?
我所追求的是:
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
...但我看不出如何逃避斜线,所以这有效。
答案 0 :(得分:1)
您不能直接使用带路径分隔符的文件名。我在这些情况下使用了百分比编码:
import urllib
# outputs "foo%2Fbar"
print urllib.quote('foo/bar', '')
这种解决方案的优点在于百分比编码是完全可逆的,因此您可以完美地重新构建文件名。如果您仅使用/
之类的内容替换_
,则您无法知道原始字符是/
还是_
。使用百分比编码,您可以,因为它也会逃脱%
符号。
答案 1 :(得分:0)
您可以通过用其他符号(即_)替换它们来“逃避”斜杠。当然,可能会出现一些碰撞。但我想文件名中只允许使用符号,但服务名称中不存在符号。
更复杂的解决方案:您可以使用base32等内容对服务名称进行编码。