2017-11-09 6 views
0

이것이 작동하지 않는 이유를 이해할 수 없다 - 내 루프는 첫 번째 반복에서는 훌륭하게 작동하지만 멈추고 - x [0]은 항상 작동하지만 next 중첩 된 for 루프는 작동한다 처음으로 ... 어떤 아이디어? 파이썬에서for 루프가 처음 반복 된 후 멈춤 - 파이썬

csv_reader=csv.reader(guuids, delimiter='\t') 
    matrix_reader=csv.reader(matrix, delimiter='\t')   

    for line in csv_reader: 
      x = line 
      print x[0] 
      for mline in matrix_reader: 
        if x[0] in mline[0] or x[0] in mline[1]: 
          out.append(mline) 
+3

무엇이'matrix_reader'입니까? –

+1

'matrix_reader'의 시작 부분으로 돌아가려고 했습니까? –

+1

'matrix_reader'의 내용은 무엇입니까? – Jerrybibo

답변

1

많은 반복 가능한 객체 - 당신이 for 루프에서 in 후 넣을 수있는 것들 - 한 번 이상 반복 될 수있다. 그 후에, 그들은 끝났습니다. 그들은 처음으로 되돌아 갈 수 없으며, 그 이상의 반복 시도는 아무것도 포함하지 않은 것처럼 행동 할 것입니다. csv.reader 객체는 이것의 한 예입니다. 외부 루프의 첫 번째 반복에서 matrix_reader이 제공 할 수있는 모든 사용 가능한 레코드를 반복합니다. 따라서 코드가 다음 번에 해당 줄로 돌아 오면 matrix_reader이 비어있는 것처럼 보입니다.

아마도이 문제를 해결하기위한 가장 쉬운 방법은 새로운 반복 할 때마다 matrix_reader을 새로 만드는 것입니다. 그래서 같이 : 당신이 한 번 통과 한 후 csv.reader이 소진됩니다 왜

for line in csv_reader: 
    matrix_reader = ... 
    for mline in matrix_reader: 
     ... 

이해하려면 csv.reader하지CSV 파일을 대표한다는 것을 알아야한다. 사실, 그 이름에도 불구하고 실제로는 "변환기"가 더 많습니다. 어떤 소스에서 텍스트 줄을 가져 와서 하나씩 목록으로 변환합니다. 독자가 회선을 변환 한 후에는 회피합니다. 이를 통해 독자 객체는 거대한 메모리 덩어리를 사용하지 않고 수백만 행을 처리 할 수 ​​있습니다.

이 접근법의 단점은 독자 객체가 이전에 되돌아 가서 이전 줄을 반복하는 텍스트 소스를 어떻게 든 알 수 없으면 이전에 처리 한 행으로 돌아갈 수 없다는 것입니다. 그러나 기본 소스가 그렇게 할 수 있다고 보장 할 수는 없습니다. 예를 들어, 소스가 다른 프로그램의 출력 일 경우 프로그램이 돌아가서 이전 출력 행을 반복하도록 말할 수 없습니다. 또는 소스가 인터넷을 통해 스트리밍되는 텍스트 인 경우 이전에 스트리밍 된 라인을 반복하도록 소스를 반드시 말할 수는 없습니다. 따라서 독자는 오래된 라인에 액세스 할 수 있다는 것에 의지 할 수 없기 때문에 마지막 라인에 도달했을 때 유일하게 합당한 동작은 마치 아무것도 남지 않은 것처럼 행동하는 것입니다.

관련 문제