2013-04-09 3 views
3

내가하려는 것은 CSV 문서를 읽고 SN 열> 20에서 모든 값을 찾고 SN> 20 인 행만 사용하여 새 파일을 만듭니다.csv 문서에서 파이썬으로 특정 행을 찾는 방법

내가 할 필요가 있음을 알고

  1. 원본 파일
  2. 열기 원본 파일의 행을 통해 새 파일
  3. 으로 반복 읽기
,691 내가 할 수있었습니다 무엇

는 SN의 값이 행을 찾을 수 있습니다> 20

import csv 
import os 

os.chdir("C:\Users\Robert\Documents\qwe") 

with open("gdweights_feh_robert_cmr.csv",'rb') as f: 
    reader = csv.reader(f, delimiter= ',') 
    zerovar = 0 
    for row in reader: 
     if zerovar==0: 
      zerovar = zerovar + 1 
     else: 
      sn = row [11] 
      zerovar = zerovar + 1 
      x = float(sn) 
      if x > 20: 
       print x 

그래서 내 질문에 내가 어떻게 SN> 20 행을 새 파일로 돌려 않아도됩니다 ?

+0

대신 'print x'가 파일 핸들에 출력됩니다. –

+0

본문에서'if-then' 문을 제거하기 위해 루프 앞의'next (reader) '로 헤더를 건너 뜁니다. – chepner

답변

3

데이터를 목록에 저장 한 다음 목록을 파일에 씁니다.

import csv 
import os 

os.chdir(r"C:\Users\Robert\Documents\qwe") 

output_ary = [] 
with open("gdweights_feh_robert_cmr.csv",'rb') as f: 
    reader = csv.reader(f, delimiter= ',') 
    zerovar = 0 
    for row in reader: 
     if zerovar==0: 
      zerovar = zerovar + 1 
     else: 
      sn = row [11] 
      zerovar = zerovar + 1 
      x = float(sn) 
      if x > 20: 
       print x 
       output_ary.append(row) 

with open("output.csv",'w') as f2: 
    for row in output_ary: 
     for item in row: 
      f2.write(item + ",") 
+0

'output_ary.append (row)'로 들린다. – Jared

+0

고마워, 내가 바꿨다. – twasbrillig

+0

이것은 필요한 것보다 훨씬 많은 메모리를 사용합니다. 해당 행을 모두 목록에 저장하는 대신 읽기 때 출력 파일에 해당 행을 인쇄하십시오. – chepner

0

코드에서 행을 통한 읽기/반복은 매우 복잡합니다. 그것은 청소 (빠른 파이썬에서 실행) 다음과 수 :

with open('gdweights_feh_robert_cmr.csv', 'rb') as f: 
    output_ary = [row for row in f if float(row[11]) > 20] 

파이썬에 최적화되어 더 효율적으로 미리 형성 할 수 있도록, ([f는 경우 행에 대해 행]) 지능형리스트를 사용. 그리고 ... reader 배열을 만들 필요가 없기 때문에 필요한 메모리가 줄어들며 csv 파일이 큰 경우 매우 편리합니다.

그러면 다른 답변에서 제안한대로 outout_ary를 작성할 수 있습니다.

희망이 도움이됩니다.

+0

이 문제는 문자열을 float로 변환 할 수 없다는 것입니다. –

+0

흥미 롭습니다. 문자열을 float으로 캐스팅 할 수 있습니다. 's = '3', y = float (s)'. 문자열에 숫자가 아닌 문자가 포함되어 있으면 충돌을 볼 수 있습니다. 'float ('3a')'는 ValueError가됩니다. 문자열에 인용 부호가 포함되어 있으면이 또한 발생합니다 –

관련 문제