2013-06-14 4 views
9

몇 가지 방법이 작업을 수행합니다 :효율적으로 읽기 마지막 'N'행

  1. 는 가장 좋은 방법은이 작업을 수행 뭐죠 어떻게 든 (파일을 역 전체 CSV를 읽은 후 df.tail
  2. 를 사용) 대용량 파일의 경우? nrows 인수를 사용하여
  3. 어떻게 든 CSV에서 행 수를 찾은 다음 skiprows을 사용하고 필요한 행 수를 읽습니다. (이 어떻게 작동하는지 확실하지하지만)
  4. 어쩌면 덩어리가 폐기 읽기 않는 초기 덩어리는

는 일부 쉬운 방법으로 수행 할 수 있습니까? 그렇지 않은 경우이 세 가지 중에서 어느 것을 선호해야하며 그 이유는 무엇입니까?

아마 관련 :

  1. Efficiently finding the last line in a text file
  2. Reading parts of ~13000 row CSV file with pandas read_csv and nrows

직접 관련되지 않음 :

  1. How to get the last n row of pandas dataframe?
+1

또한 seek()을 수행 한 후 뒤로 이동할 수 있습니다. –

답변

13

내가 팬더를 생각하지 않는이 작업을 수행 할 수있는 방법을 제공합니다 read_csv.

아마도 (한 번에)가 산뜻한 사용하는 것입니다 collections.deque :

from collections import deque 
from StringIO import StringIO 

with open(fname, 'r') as f: 
    q = deque(f, 2) # replace 2 with n (lines read at the end) 

In [12]: q 
Out[12]: deque(['7,8,9\n', '10,11,12'], maxlen=2) 
     # these are the last two lines of my csv 

In [13]: pd.read_csv(StringIO(''.join(q)), header=None) 

시도할만한 가치가 또 다른 옵션은 get the number of lines in a first pass이다 후, 다시 파일을 읽을 read_csv를 사용하여 행의 수 (마이너스 N)를 건너 ...

7

파일은 단순히 바이트 스트림입니다. 라인은 별도의 엔티티로 존재하지 않습니다. 그들은 특정 바이트를 개행 문자로 취급하는 아티팩트입니다. 따라서 을 순서대로 줄을 식별하기 위해 파일의 처음부터 읽어야합니다.

파일이 변경되지 않고 자주 수행해야하는 작업 인 경우 (예 : n의 다른 값으로) 두 번째 파일에 줄 바꿈 문자의 바이트 오프셋을 저장할 수 있습니다. 훨씬 더 작은 파일과 seek 명령을 사용하면 첫 번째 파일의 주어진 줄로 빠르게 건너 뛰고 거기에서 읽을 수 있습니다.

(일부 운영 체제는 일반적인 플랫 파일보다 더 복잡한 내부 구조를 기록 지향 파일을 제공합니다. 위의 내용들을 적용되지 않습니다.)

1

다음은 편리한 방법입니다. 내가하고 싶은대로 잘 작동합니다. -

import tailer as tl 
import pandas as pd 
import io 
file = open(fname) 
lastLines = tl.tail(file,15) #to read last 15 lines, change it to any value. 
file.close() 
df=pd.read_csv(io.StringIO('\n'.join(lastLines)), header=None) 
관련 문제