2012-09-05 4 views
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에 나열된 문자열을 포함하지 않는 모든 행을 무시하는 것이 었습니다. 여기에 뭔가 잘못되었습니다 ...파이썬 파일 I/O

이 문제를 어떻게 해결할 수 있습니까?

+0

이 codereview.stackexchange.com –

+2

한 스타일의 힌트에 더 적합 할 수 있습니다 대신'내용 = f.readlines의(); line in content :''do''를''f''의 줄에''그냥하십시오. –

답변

6

문자열의 .find() 메서드는 부분 문자열을 찾을 수없는 경우 -1을 반환합니다. -1은 0이 아니므로 true로 간주됩니다. 이것은 아마 당신이 예상 한 것이 아닙니다.

더 파이썬 방법은 (당신이 문자열의 위치를 ​​신경 쓰지 않기 때문에)에 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): 
+2

나는''WECS 번호 '', 'WECS 이름')'을 쓰고 그 다음에''모든 것을 묶는 것이 아니라''어떤 것이 든 (구에서 한 마디로 된 구) '라고 쓰고 싶습니다. 그것이 정말로 원하는 'startswith'라면, 그것은 더 좋습니다 :'line.startswith (문구)'. – DSM

+0

나는 둘 다 아주 좋고 정확하기 때문에 나는 첫번째 응답을 신용해야한다. 고마워요 ... – Giuseppe

+0

그 구문을 좋아합니다. 이제 왜 Stack Overflow에 너무 많은지 알게되었습니다. – Giuseppe

1

문자열 find() 메서드는 문자열이 없으면 -1을 반환합니다. 부울 컨텍스트에서 -1은 true로 간주됩니다. 따라서 if 절은 생각하지 않을 때 실행됩니다. 하위 문자열이 있는지 여부를 테스트하려면 if "blah" in line을 사용하는 것이 좋습니다.

1

str.find는 문자열을 찾을 수없는 경우 -1을 반환하고, boolean(-1) == True, 그래서 line.find("WECS number")는 항상 선이 경우 line.find("WECS name")이 True, WECS 번호로 시작하는 경우를 제외하고는 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!")