字符串错误中的find()字符

时间:2013-05-11 08:42:30

标签: python python-2.7

我有以下代码段:

#!/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和“:” - >视窗

3 个答案:

答案 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.findstr.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运算符: