2012-02-08 86 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