2013-09-01 2 views
12

두 개의 탭 구분 파일이 있는데 다른 파일의 모든 행에 대해 첫 번째 파일의 모든 행을 테스트해야합니다.하나의 중첩 루프에서 벗어나는 방법

row1 c1 36 345 A 
row2 c3 36 9949 B 
row3 c4 36 858 C 

파일 2 :

row1 c1 3455 3800 
row2 c3 6784 7843 
row3 c3 10564 99302 
row4 c5 1405 1563 

하는의 내가 내지 컬럼 [3] 파일 1의보다 작은있는 (파일 1) 출력의 모든 행을 싶습니다 가정 해 봅시다 예,

파일 1의 경우 col [1]이 동일하다면 file2의 col (2)가 아닌 모든 col (2).

예상 출력 : 나는 우분투하고 있어요 때문에

row1 c1 36 345 A 
row2 c3 36 9949 B 

, 나는 다음과 같이하기 위해 입력 명령을 싶습니다

import sys 

filename1 = sys.argv[1] 
filename2 = sys.argv[2] 

file1 = open(filename1, 'r') 
file2 = open(filename2, 'r') 

done = False 

for x in file1.readlines(): 
    col = x.strip().split() 
    for y in file2.readlines(): 
     col2 = y.strip().split() 
     if col[1] == col2[1] and col[3] < col2[2]: 
      done = True 
      break 
     else: continue 
print x 
: python code.py [file1] [file2] > [output]


나는 다음과 같은 코드를 작성

그러나 출력은 다음과 같습니다.

row2 c3 36 9949 B 

이것은 더 큰 데이터 세트에서 분명하지만 기본적으로 항상 중첩 루프의 조건이 참인 마지막 행만 가져옵니다. 나는 "휴식"두 루프에서 나를 깨고 의심입니다. 나는 (1) for 루프 중 하나에서 벗어나는 법을 알고 싶다. (2) 이것이 유일한 문제라면 여기에있다.

+1

'break'는 사용자를 가장 안쪽 루프에서 분해합니다. –

+0

관련 내용 : [두 파일을 비교하고 새 파일에 쓰지만 몇 줄만 출력 하시겠습니까?] (http://stackoverflow.com/questions/18514979/compare-two-files-and-write-to-a-new- file-but-only-output-a-few-lines) –

답변

19

breakcontinue이 가장 안쪽 루프에 적용됩니다.

두 번째 파일을 한 번만 열면 문제가 하나만 읽히는 것이 있습니다. 두 번째로 for y in file2.readlines():을 실행하면 file2.readlines()은 빈 반복을 반환합니다.

file2 = open(filename2, 'r')을 바깥 쪽 루프로 이동하거나 seek()을 사용하여 file2의 시작 부분으로 되감습니다.

2

숫자 문자열을 해당 정수 값으로 구문 분석해야합니다.

다음과 같이 int('hoge')을 사용할 수 있습니다.

import sys 

filename1 = sys.argv[1] 
filename2 = sys.argv[2] 

with open(filename1) as file1: 
    for x in file1: 
     with open(filename2) as file2: 
      col = x.strip().split() 
      for y in file2: 
       col2 = y.strip().split() 
       if col[1] == col2[1] and int(col[3]) < int(col2[2]): 
        print x 
관련 문제