2014-12-29 5 views
0

큰 .csv 파일을 파이썬으로 열어 각 행을 분리하고 마지막 x 줄을 새 목록에 추가하려고했습니다.큰 .csv 파일을 파이썬에서 열 수 없습니다.

btcDatear = [] 
btcPricear = [] 
btcVolumear = [] 
howfarback = 20000 
try: 
    sourceCode = open('.btceUSD.csv', 'r') 
    splitSource = sourceCode.split('\n') 

     for eachline in splitSource[-howfarback:]: 
      splitLine = eachline.split(',') 
      btcDate = splitLine[0] 
      btcPrice = splitLine[1] 
      btcVolume = splitLine[2] 

      btcDatear.append(float(btcDate)) 
      btcPricear.append(float(btcPrice)) 
      btcVolumear.append(float(btcVolume)) 


except Exception, e: 
    print "failed raw data", str(e) 

20 메가 비트의 작은 파일로 성공하고이 하나는 700MB이므로 내 코드에는 아무런 문제가 없다고 생각합니다. 3 개의 열을 세 개의 별개 목록으로 만드는 더 좋은 방법이 있습니까? 마지막 x 숫자가 필요해. 또는 내 파일이 내 코드를 통과 할 정도로 작아서 처음 200.000을 제거 할 수 있습니까?

가능한 경우이 작업 중 하나를 수행하려면 + -3 분 이내 여야합니다.

+0

배열 x 번호를 크게 만들고 현재 줄 번호를 모듈로 x로 쓸 수 있습니다. – usr1234567

+0

모든 데이터를 목록에 보관하지 말고 읽은대로 처리하십시오. 그리고 실제로'sourceCode.split ('\ n')'을하지 말고'for' 루프를 사용하십시오. –

+0

감사합니다. 어떻게 할 수 있습니까? 왜냐하면 내가 목록에 전체 파일을 열어야하므로 마지막 x 행이 필요하기 때문입니까? – henkaap

답변

2

"파일을 분할 할 수 없습니다."그러나 수는은 아무리 크게해도 라인별로 읽습니다. 예컨대 : howfarback의 최대 길이와 deque 구축

import collections 

btcDatear = [] 
btcPricear = [] 
btcVolumear = [] 
howfarback = 20000 
try: 
    with open('.btceUSD.csv', 'r') as sourceCode: 
     lastNlines = collections.deque(sourceCode, howfarback) 
    for eachline in lastNlines: 
     splitLine = eachline.split(',') 
     btcDate = splitLine[0] 
     btcPrice = splitLine[1] 
     btcVolume = splitLine[2] 

     btcDatear.append(float(btcDate)) 
     btcPricear.append(float(btcPrice)) 
     btcVolumear.append(float(btcVolume)) 
except Exception as e: 
    print "failed raw data", str(e) 

만 처음부터 라인으로 라인을 읽을 수있는 파일의 마지막 N 라인을 유지하는 가장 좋은 방법입니다. with 문은 파일이 무엇이든지간에 제대로 닫히도록 보장합니다. 논리의 나머지 부분은 코드에 있습니다. 표준 라이브러리 csv 모듈을 적용하는 것이 더 좋지만, 넥타이로 배우는 한 비트 :-).

Unixy 시스템에서 "마지막 N 줄"을 더 빨리 얻을 수있는 트릭이있을 수 있습니다 (CSV 파일이 탐색 가능성이 높다는 사실을 악용합니다). tail 시스템 명령어는 매우 좋습니다. 이 간단한 접근 방식의 성능이 너무 느린 경우 다시 질문하면 다음과 같은 내용을 토론합니다 :-) [csv 모듈을 가장 잘 사용하는 방법 ...]

올린 날짜 : Get last n lines of a file with Python, similar to tail에 잘 설명되어있는 것처럼 "꼬리 트릭"을 무난히 생각할 필요가 없습니다. Python 전문가 인 Armin Ronacher가 질문합니다. 코드의 품질과 답변 및 긴 토론을 확신 할 수 있습니다. 흥미 롭습니다.

이렇게 단순한 접근법이 너무 오래 걸리면 Armin과 그의 응답자는 ... 매우 까다 롭지 만 실제로 유용 할 수 있습니다. 이전과

for fields in csv.reader(iter(lastNlines)): 
     btcDate, btcPrice, btcVolume = fields[:3] 

나머지는 모두 ... 단지 변화하는 부분을 재 작성 -

그래서 우리는뿐만 아니라 확인하기 위해 시작에서 import csvcsv 모듈의 사용에 초점을 맞출 수 있습니다 . csv.reader은 CSV 파싱을 처리합니다 (따옴표 붙은/쉼표로 쉼표를 처리하는 등의 미묘함은 필요하지 않지만 추가 비용을 지불하지 않아도됩니다.) - 코드가 더 간결하고 우아합니다.

+0

'deque'가 자동으로 그렇게 채울 수 있는지 몰랐습니다. 그리고 나는 해적 모자를 좋아합니다. –

+0

@MarkRansom, 네, 해적 모자는이 "winter bash"기간 동안 나에게 수여 한 11 개의 모자 중에서 가장 차가워 보이는 모자입니다. 그래서 나는 그 모자를 착용하고 있습니다.그리고,'deque'에 대한'maxlen' 옵션 매개 변수는 파이썬 2.6에서 진정으로 유용한 추가 기능이었습니다! –

+0

sooooooo 많은 감사합니다! 완벽하게 작동합니다. 이제는 훌륭해 CSV 모듈을 살펴볼 것입니다. 놀라운 답변을 게시 한 다른 모든 사람들에게 다시 한 번 감사드립니다! – henkaap

관련 문제