2012-02-08 6 views
3

私は自宅でビジネスを行い、2日前にPythonを使い始めました。私は、行ごとにログファイルを検索し、システムが私の必須命名規則に合致しないかどうかを教えるスクリプトを書こうとしています。複数の異なるスキームがあり、スクリプトでそれらをすべて探したいと思っています。私はリストを使用しようとしましたが(下に見られるように)、それは動作しませんし、通常の括弧で試してみて、私にエラーが出ました(タプルではなく左のオペランドが必要です)。私は問題を抱かせる行に注意した。Python 2.7.2 1つの変数に複数の値があります

#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 

ヒントやヒントがあれば幸いです。あなたが心配する必要はありませんので、あなたは自動的にブロックの終了時にファイルを閉じwithを使用して

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 

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 

答えて

2

私はこのようなコードを書き換えることをお勧めし

+0

それはそれをしました!本当にありがとう! – user1197368

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 

置き換えますそれを閉じることを忘れることについて。 forループでelse:を使用すると、ループを早期に中断しない場合にのみトリガーされます。

+0

if t in lineの言うことができます!本当にありがとう! – user1197368

1

anyを使用して確認してください。 1つの行が見つかるとすべてのタグを試行しないので、より効率的です。

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

+1を使用すると良いアイデア。 – hochl

+0

実際、これはより良い解決策です。b/c:「xのタグはxの行にあります」はジェネレータであり、私の解決策と比較して最初のTrue値が見つかるとすぐに停止します: if [x in tag in x in line]:... " – Samvel

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)のそれぞれをループする必要があります。文字列tlineに含まれているかどうかを確認する必要があります。

一致するタグを1つだけ探しているので、最も簡単な方法はブール変数で追跡することです。

あなただけそのタグで始まるログメッセージを探したい場合、あなたはこれも動作しますif line.startswith(t)代わり

+0

あなたはcontains_tagフラグは必要ありません。 "for ...:...、else:..."を使用してください。 "else"は、forループでブレークが使用されなかった場合にのみ実行されます。したがって、print文を "else"ブロックに入れてください。 – Samvel

+0

ああ、for .... elseがあるかどうかはわかりませんでした。ありがとう。 – bcoughlan

+0

"else"はwhileとforの両方のループで使用できます。 – Samvel

関連する問題