【问题标题】:find() character in string error字符串错误中的 find() 字符
【发布时间】:2013-05-11 08:42:30
【问题描述】:

我有以下sn-p:

#!/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 和 ":" -> Windows

【问题讨论】:

  • 如果你想检测操作系统,为什么不直接阅读sys.platform呢?如果它包含linux,那么它就是Linux。如果它包含win32,那么它就是 Windows。如果它包含darwin,那么它就是Mac OS X。更多信息请参见stackoverflow.com/questions/446209/…
  • 这只是一个例子,我不依赖它来检测操作系统。

标签: python python-2.7


【解决方案1】:
#!/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`)。

或尝试:

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'

【讨论】:

  • 如果转义序列无效,Python 会自动执行此操作(转义 '\')。
  • 是的,但假设这是愚蠢/懒惰的,因为有一天你会得到\a 或类似的东西,你会想知道为什么:)
【解决方案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 - 排除特定异常总是一个好主意,并且可以在发生意外错误时轻松调试。

【讨论】:

    【解决方案3】:

    你可以用在

    if "/" in mypath:
        print 'yay :)'
    

    http://docs.python.org/2/library/stdtypes.html#str.find

    只有在需要知道位置时才应使用 find() 方法 子。要检查 sub 是否为子字符串,请使用 in 运算符:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多