2012-11-07 5 views
1

제 목적으로 실제로 행을 사용하기 전에 (CSV) 파일의 행 수를 알아야합니다. 내가 봤 거든 그 설명서는 내가 반복기 (CSV.reader)를 두 번 (첫 번째 계산에 대한 두 번째와 행에 대한 작업)를 작성해야한다는 것을 발견했다. 이것이 유일한 방법인가, 아니면 트릭을 수행하는 까다로운 방법이 있을까요?파이썬을 사용한 CSV 조작

답장을 보내 주셔서 감사합니다.

+1

먼저 우리가 이해할 필요를 왜 그들과 함께 작업하기 전에 행 번호가 필요합니까 –

+0

행 수> N (N은 모든 사용자마다 다름)이면 파일을 처리하지 않아야합니다. – alexvassel

+0

적어도 내게는이 작업을 수행 할 수있는 다른 방법이없는 것처럼 보입니다. 모든 경우에 모든 행을 읽고 모든 행을 진행하는 것은 다른 일입니다. 따라서 체크인보다 크기를 모두 읽으라고 권하고 있습니다. lines - 그렇지 않으면 다음 파일로 전환합니다. –

답변

1

:

from csv import reader 

def proceed(size): 
    with open(filename) as f: 
     data = list(csv.reader(f)) 
     if len(data) > size: 
      return 
     else: 
      for line in data: 
       #do action 


weights = {'user1': 4, 'user2': 5} 
for k,v in weights.iteritems(): 
    proceed(v) 

또는

당신이 매우 큰 파일이있을 때 경우에 @georgesl에 의해 제안 :

def proceed(size): 
    if sum(1 for row in csv.reader(open(filename))) > size: 
     return 
    else: 
     for line in csv.reader(open(filename)): 
      #do action 
+0

파일의 적절한 크기는 얼마입니까? 100KB는 어떻습니까? – alexvassel

+1

파일 크기가 큰 경우'row_count = sum (csv.reader (open ('filename.csv'))) 행의 ​​행이 1 인 경우)은 크기에 더 좋습니다 – lucasg

+0

@alexvassel 적절한 파일 크기는 혼수 상태에 컴퓨터를 넣으십시오 - 1GB CSV 파일은 아마도 최신 기계에 스트레스를주지 않을 것입니다 ... –

1

내가 파일을 읽지 않고 방법을 알고하지 않습니다,하지만 당신의 병목 현상은 위치에 따라 그냥 N 라인을 처리 할 수 ​​있으며,이 경우 더 예를 들어, 그것들을 버리 :

count = 0 
for line in reader: 
    count += 1 
    if count > N: # Over the limit so stop processing 
     break 
    else: 
     processed_data += process(line) 
else: 
    # This block only runs if the loop completed naturally, i.e. count <= N 
    return processed_data 

process(line)이 비싼 경우 질문에 설명 된대로 두 개의 루프를 사용하는 것이 가장 좋습니다. 당신이 시도 할 수있는 것보다 파일이 매우 큰 수없는 경우

관련 문제