2013-07-10 1 views
1

"list.txt"입력 파일에서 삭제하려고하는 invalid_change 변수에 id가 있습니다. 아래에 results.txt 파일을 만듭니다. 누구나 입력 방법을 제공 할 수 있습니다. ?이 고정 될 수있다 나는 샘플 입력 아래 예상 출력을 ..을더 많은 ID가 결과 텍스트 파일에서 삭제됨

''' 
INPUT(list.txt:- 

350882 348521 350166 
346917 352470 
360049 


EXPECTEDOUTPUT(results.txt):- 
350882 348521 350166 
346917 
360049 
''' 
invalid_list=['352470','12345'] 

f_write = open('results.txt', 'wb') 

with open('list.txt','r') as f : 
    for line in f : 
     #delete the whole line if any invalid gerrit is presnet 
     gerrit_list = line.strip().split(' ') 

     ifvalid = True 
     for gerrit in gerrit_list: 
      try: # check if invalid gerrit is present 
       invalid_gerrit.index(invalid_change) 
       ifvalid = False 
       break 
      except: 
       pass 

     if ifvalid: 
      f_write.write(line) 

f_write.close() 

답변

0

문제는 당신이 선에 도달했을 때 :

346917 352470 

ifvalid 변수 따라서이 False과로 설정을 특정 라인 (조정 된 경우에도)이 기록되지 않습니다. en을 출력 파일에 추가하십시오.

가능한 해결책 :

  1. 수정 문자열 예. 정규식을 사용하여. 그들은 대신 할 것입니다.
  2. 파일에 "유효하지 않은"행을 건너 뛰지 말고 제거하려는 ID없이 솔루션을 준비하십시오 (솔루션 번호 1처럼).

질문이 있으시면 알려주십시오. 코드에서

다른 문제는 다음과 같습니다

가 이
  • 기저귀 안티 패턴 (만 ValueError를 잡아, 또는 오히려 in 키워드를 포함하여 테스트를 수행해야하는 동안, NameError를 포함한 모든 예외를 잡기)
      - 이것은이다 당신이 invalid_changeinvalid_gerrit 변수의 부족으로 관련 오류가 표시되지 않는 이유는, 파이썬 2.7 이상 또는 3.1,이있는 경우 대신 열고 f_write을 닫는
    • , 당신은, 당신이 이미 사용하고있는 with 성명에서 또한 그것을 사용할 수 있습니다
    • str.split() 공백으로 기본적으로 분할하고, 그 결과에서 빈 문자열을 제거, 그래서 쓰는 대신 line.strip().split(' ') 당신은 단지 line.split() 쓸 수
  • +0

    어떤 정규 표현식을 추천 할 수 있습니까? 정규식은 과장 일 수 있습니다. – user2341103

    +0

    @ user2341103 : 그래, 과장된 것 같아서 피하려고합니다. 그것이 당신의 프로젝트에 어울리는다면 당신이 제안해야 할 제안이었습니다. – Tadeck

    0

    gerrit_list의 각 항목은 개별 번호입니다. 유효하지 않은 변경 사항이 해당 번호에 포함되어 있는지 확인할 필요가 없습니다. 사실 그것은 버그를 일으킬 수 있습니다. gerrit_list의 항목을 직접 반복하여 invalid_list와 일치하는 항목을 버릴 수 있습니다.

    for line in f: 
        gerrit_list = line.split() 
        valid_gerrits = [gerrit for gerrit in gerrit_list if gerrit not in invalid_list] 
        if valid_gerrits: 
         newline = ' '.join(valid_gerrits) + '\n'   
         f_write.write(newline) 
    
    +0

    @lib - 만약 입력이리스트 인 경우 개별 번호 만 입력하면 ... 내 논리에서 입력을 변경했습니다. – user2341103

    +0

    그런 다음'if gerrit! = invalid_list' 대신'invalid_list'에있는'gerrit if not use '를 사용하십시오. – llb

    +0

    여기에 fwrite 란 무엇입니까? 출력 파일입니까? – user2341103

    관련 문제