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

팁이나 트릭이 가장 만족 스럽습니다. 당신이 걱정할 필요가 없습니다, 그래서 당신은 자동적으로 블록의 출구에있는 파일을 닫습니다 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을 사용하여 확인하십시오. 태그가 일치하면 모든 태그를 시도하지 않으므로 더 효율적입니다.

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

+1을 사용하는 것이 좋습니다. – hochl

+0

실제로이 방법이 더 나은 해결책입니다. b/c : "태그의 x가 x 인 줄"이 제 발생기이고 내 솔루션과 비교할 때 첫 번째 True 값이 발견되는 즉시 모든 (...)이 중지됩니다. " if [x in tag for 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에 포함되어 있는지 확인해야합니다.

일치하는 태그 하나만 찾고 있기 때문에 가장 간단한 방법은 부울 변수를 추적하는 것입니다.

만 해당 태그로 시작 로그 메시지를 찾기 위해 원하는 경우, 이것은 또한 작동 if line.startswith(t) 대신

+0

당신은 contains_tag 플래그가 필요 없습니다. "for ... : ..., else : ..."구조를 사용하십시오. "else"는 for 루프에서 중단이 사용되지 않은 경우에만 실행됩니다. 따라서 print 문을 "else"블록에 넣으십시오. – Samvel

+0

아, for .... else가 있다는 것을 몰랐습니다. 감사. – bcoughlan

+0

"else"는 while 및 for 루프에서 사용할 수 있습니다. – Samvel

관련 문제