2014-10-15 8 views
0

이 파이썬 코드를 사용하여 하나의 열에 날짜가 있고 다른 열에 값이있는 csv를 살펴 봅니다. 나는 매년 최소값을 기록하고있다. 내 코드가 제대로 루핑되지 않습니다. 내 바보 같은 실수가 뭐니? 건배Python 스크립트가 올바르게 반복되지 않습니다.

import csv 
refMin = 40 

with open('data.csv') as csvfile: 
     reader = csv.reader(csvfile, delimiter=',',quotechar='|', quoting=csv.QUOTE_ALL) 
     for i in range(1968,2014): 
      for row in reader: 
       if str(row[0])[:4] == str(i): 
        if float(row[1]) <= refMin: 
         refMin = float(row[1]) 
      print 'The minimum value for ' + str(i) + ' is: ' + str(refMin) 
+0

올바르게 루핑되지 않는다는 표시는 무엇입니까? – Rob

+0

'for row in reader'와 관련된 for 루프는 1968 년 동안 만 반복하며 다른 연도는 없습니다. – Sam

+0

네, 일단 리더가 끝까지 도달하면 파일의 처음으로 돌아 가지 않기 때문에 – njzk2

답변

4

리더는 한 번만 반복 할 수 있습니다. for i in range(1968,2014) 루프를 처음 실행하면 독자의 모든 항목이 소모됩니다. 따라서 두 번째로 루프 주변에는 아이템이 남아 있지 않습니다. 당신이 파일의 모든 행에 대해 i의 모든 값을 비교하려면 루프 for row in reader 외부에 만 대신 i 루프의 여러 실행에 한 번 실행되도록

, 당신은 주위에 당신의 루프를 교환 할 수 있습니다. 또는 매번 새로운 리더를 만들 수도 있지만 속도가 느릴 수도 있습니다.

전체 파일을 한 번에 처리하려면 refMin을 대체 할 값 사전을 만들어야합니다. 각 행을 처리 할 때 사전 키를 반복하거나 현재 행을 기준으로 조회합니다. 반면에 파일을 여러 번 읽으려면 바깥 쪽 루프 안에 reader = csv.reader(...) 줄을 옮기십시오.

import csv 
import collections 
refMin = collections.defaultdict(lambda:40) 

with open('data.csv') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',',quotechar='|', quoting=csv.QUOTE_ALL) 
    allowed_years = set(str(i) for i in range(1968,2014)) 
    for row in reader: 
     year = int(str(row[0])[:4]) 
     if float(row[1]) <= refMin[year]: 
      refMin[year] = float(row[1]) 

for year in range(1968, 2014): 
    print 'The minimum value for ' + str(year) + ' is: ' + str(refMin[year]) 

defaultdict 그냥 이전에 설정되지 않은 키에 대한 기본 값을 갖는 것을 제외하고는 일반 사전과 같다 :

여기에 한 번에 그 일을 위해 검증되지 않은 생각입니다.

+0

감사합니다. 감사합니다. 이 문제를 해결하기 위해 내가 취할 수있는 조치를 아십니까? – Sam

+0

제안 사항을 수정했습니다. – Weeble

+0

if 문을 사용하여 연도가 해당 범위에 있는지 테스트 할 수 있습니다. – Rob

0

나는 한 번만 파일을 읽을 것을 리팩토링 것 : 여기

import csv 
refByYear = DefaultDict(list) 

with open('data.csv') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',',quotechar='|', quoting=csv.QUOTE_ALL) 
    for row in reader: 
     refByYear[str(row[0])[:4]].append(float(row[1])) 
for year in range(1968, 2014): 
    print 'The minimum value for ' + str(year) + ' is: ' + str(min(refByYear[str(year)])) 

내가 다른 목적에 유용, 또는 완전히 쓸모가있을 수있는, 매년 모든 값을 저장합니다.

관련 문제