0
fPath = raw_input('File Path:')
counter = 0;
flag = 0;

with open(fPath) as f:
    content = f.readlines()

for line in content:
    if flag == 0 and line.find("WECS number") or \
    line.find("WECS number") or \
    line.find("WECS name") or \
    line.find("Manufacturer") or \
    line.find("Type") or \
    line.find("Nominal effect") or \
    line.find("Hub height") or \
    line.find("x (local)") or \
    line.find("y (local)") or \
    line.find("x (global)") or \
    line.find("y (global)"):

        if not line.find("y (global)"):
            print ("Alert Last Line!");
        else:
            print("Alert Line!");

出于某种原因,代码似乎正在打印“警报行!” 如果一行只是“\n”。我创建“if and or”结构的意图是忽略所有不包含line.find's 中列出的字符串的行。这里出了点问题……

我该如何解决这个问题?

4

3 回答 3

6

如果未找到子字符串,则字符串的.find()方法返回。是非零的,因此被认为是真的。这可能不是您所期望的。-1-1

一种更 Pythonic 的方式(因为您不关心字符串的位置)是使用in运算符:

if "WECS number" in line:   # and so on

您还可以在适当的情况下使用startswith()endswith()

if line.startswith("WECS number"):

最后,您只需使用括号将整个布尔表达式括起来即可避免所有这些反斜杠。如果括号打开,Python 会继续下一行。

if (condition1 or condition2 or
    condition3 or condition4):
于 2012-09-05T22:28:10.620 回答
1

str.find如果它没有找到子字符串,则返回 -1 boolean(-1) == True,因此line.find("WECS number")始终为 True,除非行以 WECS 编号开头,在这种情况下line.find("WECS name")为 True。

你要:

fPath = raw_input('File Path:')

with open(fPath) as f:
  for line in f:
    if any(s in line for s in ("WECS number", "WECS name", "Manufacturer","Type",
                               "Nominal effect", "Hub height", "x (local)",
                               "y (local)", "x (global)", "y (global)",)):

        if "y (global)" in line:
            print("Alert Line!")
        else:
            print ("Alert Last Line!")
于 2012-09-05T22:33:03.887 回答
1

find()如果未找到字符串,则string方法返回 -1。-1 在布尔上下文中被视为真。因此,当您认为它们不执行时,您的 if 子句正在执行。你最好if "blah" in line只测试子字符串是否存在。

于 2012-09-05T22:28:44.197 回答