2013-06-14 14 views
9

alcuni metodi per farlo:efficiente Leggi ultimi 'n' file di CSV in dataframe

  1. leggere l'intero CSV e quindi utilizzare df.tail
  2. In qualche modo invertire il file (che cosa è il modo migliore per fare questo per file di grandi dimensioni?) e quindi utilizzare l'argomento nrows per leggere
  3. In qualche modo trovare il numero di righe nel CSV, quindi utilizzare skiprows e leggere il numero di righe richiesto.
  4. magari fare pezzo leggere scartando pezzi iniziali (anche se non sicuro di come questo dovrebbe funzionare)

può essere fatto in un certo modo più semplice? In caso negativo, quale tra questi tre dovrebbe essere preferito e perché?

Possibilmente corrispondenti

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

non direttamente correlati:

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

Si potrebbe anche 'seek()' e quindi andare indietro. –

risposta

13

Non credo panda offre un modo per fare questo in read_csv.

Forse la più pulita (in un solo passaggio) è quello di utilizzare 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) 

Un'altra opzione da provare è quella di get the number of lines in a first pass e quindi leggere nuovamente il file, ignorare che il numero di righe (meno n) utilizzando read_csv ...

7

I file sono semplicemente flussi di byte. Le linee non esistono come entità separate; sono un artefatto di trattare certi byte come caratteri di nuova riga. Pertanto, è necessario leggere dall'inizio del file per identificare le righe nell'ordine.

Se il file non cambia (spesso) e questa è un'operazione che è necessario eseguire spesso (ad esempio con diversi valori di n), è possibile memorizzare gli offset di byte dei caratteri di nuova riga in un secondo file. È possibile utilizzare questo file molto più piccolo e il comando seek per passare rapidamente a una determinata riga nel primo file e leggere da lì.

(Alcuni sistemi operativi forniscono file di record-oriented che hanno struttura interna più complessa di quanto il file flat comune. È possibile che questo non vale per loro.)

1

Ecco un modo pratico per fare. Funziona bene per quello che mi piace fare -

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)