2012-02-08 83 views
3

我在家中运行自己的业务,并在2天前开始使用Python。我正在尝试编写一个脚本,它将逐行搜索我的日志文件,并告诉我系统是否与我的强制性命名方案不匹配。有多种不同的方案,我希望脚本能够找到它们。我尝试使用列表(如下所示),但不会工作,然后我用正常的括号尝试,并给了我一个错误(需要左操作数,而不是元组)。我注意到给我一个问题的线条。Python 2.7.2一个变量的多个值

#variables 
    tag = ["DATA-", "MARK", "MOM", "WORK-"] #THIS ONE!!!!!! 

    #User Input 
    print "Please select Day of the week" 
    print "1. Monday" 
    print "2. Tuesday" 
    print "3. Wednesday" 
    print "4. Thursday" 
    print "5. Friday" 
    print "6. Saturday" 
    print "7. Sunday" 
    day = input("> ") 

    #open appropriate file and check to see if 'tag' is present in each line 
    #then, if it doesn't, print the line out. 
    if day == 1: 
     f = open('F:\DhcpSrvLog-Mon.log', 'r') 
     for line in f: 
       if tag in line: #THIS ONE!!!!!!!!!!!!! 
         pass 
       else: 
         print line 

任何提示或技巧将不胜感激!

回答

2

我建议改写这样的代码:

with open('F:\DhcpSrvLog-Mon.log', 'rU') as f: 
    for line in f: 
     for t in tag: 
      if t in line: break 
     else: 
      print line 

使用with你自动地关闭该块的出口文件,所以你不用担心关于忘记关闭它。如果您之前没有跳出循环,则仅在for循环中使用else:

+0

这样做!非常感谢! – user1197368 2012-02-08 15:00:29

1
if day == 1: 
    f = open('F:\DhcpSrvLog-Mon.log', 'r') 
    for line in f: 
      if tag in line: #THIS ONE!!!!!!!!!!!!! 
        pass 
      else: 
        print line 

更换

if day == 1: 
    f = open('F:\DhcpSrvLog-Mon.log', 'r') 
    for line in f: 
      if [x for x in tag if x in line]: #THIS ONE!!!!!!!!!!!!! 
        pass 
      else: 
        print line 
+0

这也适用!谢谢一堆! – user1197368 2012-02-08 15:01:21

1

使用any来检查这一点。它效率更高,因为如果发现某个标签符合要求,它将不会尝试所有标签。

any(x in line for x in tag) 
+0

使用任何一个好主意。 – hochl 2012-02-08 15:39:32

+0

事实上,这是一个更好的解决方案,b/c:“x in line for x in tag”是生成器,任何(...)只要找到第一个True值就会停止,与我的解决方案相比:“如果[x for line in标签中的x]:...“ – Samvel 2012-02-08 15:58:14

0
contains_tag=False 
for t in tag: 
    if t in line: 
     contains_tag=True 
     break # Found a match, break out of for loop 

if not contains_tag: 
    print (line) 

首先,你需要通过每个标签(例如for t in tag)的循环。然后,您需要检查字符串t是否包含在line中。

既然你只是在寻找一个匹配的标签,最简单的方法就是跟踪一个布尔变量。

如果你想只寻找那些该标签启动日志消息,你可以说的if line.startswith(t)代替if t in line

+0

您不需要contains_tag标志。使用“for ...:...; else:...”构建。只有在for循环中没有使用中断时才会执行“else”。因此,将print语句放入“else”块中。 – Samvel 2012-02-08 15:59:43

+0

啊,不知道有一个....是....谢谢。 – bcoughlan 2012-02-08 16:33:11

+0

“else”在两个循环中都可用:while和for。 – Samvel 2012-02-08 16:34:34