我有以下代码段:
#!/usr/bin/env python
import sys
mypath = "D:\inetpub\wwwroot"
if mypath:
try:
print "Path: %s" % mypath
if mypath.find("/"):
print "OS: Linux/Unix"
elif mypath.find(":"):
print "OS: Windows"
else:
print "OS: Unknown"
except:
print "Error"
else:
print "[?] OS detection failure."
执行输出:
$ python test.py
Path: D:\inetpub\wwwroot
OS: Linux/Unix
我做错了什么?正如我所料,我得到了相反的结果。或者有更好的方法吗? “/” - > Linux / Unix和“:” - >视窗
答案 0 :(得分:3)
#!/usr/bin/env python
import sys
mypath = "D:\\inetpub\\wwwroot"
if mypath:
try:
print "Path: %s" % mypath
if mypath.find("/") >= 0:
print "OS: Linux/Unix"
elif mypath.find(":"):
print "OS: Windows"
else:
print "OS: Unknown"
except:
print "Error"
else:
print "[?] OS detection failure."
你需要转义\
否则它将假设下一个字符具有特殊意义/二进制表示(例如\n´,
\ t \ t \ t \ t \ t \ t)。
或尝试:
mypath = r'D:\inetpub\wwwroot'
更好的方法是:
from os.path import abspath
print abspath('D:/inetpub/')
它将自动重新设置系统特定设计的路径,例如/ for linux和\ for Windows:)
或者你可以这样做:
import os
if os.name == 'nt':
print 'Windows'
else:
print 'Linux/Unix'
答案 1 :(得分:2)
问题在于您使用str.find
。 str.find
返回字符串中子字符串的索引,否则返回-1
。因为-1
在布尔上下文中是True
,所以您输入if
块。你真正想要的是in
运算符:
>>> 'hello world'.find('foo')
-1
>>> bool(-1)
True
>>> 'foo' in 'hello world'
False
现在您的代码应如下所示:
#!/usr/bin/env python
import sys
mypath = r'D:\inetpub\wwwroot' # use a raw string
if mypath:
try:
print 'Path:', mypath # no need for formatting
if '/' in mypath:
print 'OS: Linux/Unix'
elif ':' in mypath:
print 'OS: Windows'
else:
print 'OS: Unknown'
except:
print 'Error'
else:
print '[?] OS detection failure.'
一些建议:
str.format
方法。它功能更强大,建议使用旧式格式化。except
- 除了特定的异常之外总是一个好主意,如果发生意外错误,可以轻松调试。答案 2 :(得分:1)
您可以在
中使用if "/" in mypath:
print 'yay :)'
http://docs.python.org/2/library/stdtypes.html#str.find
只有在需要知道位置时才应使用find()方法 分。要检查sub是否是子字符串,请使用in运算符: