2012-05-23 15 views
7

Ho un file CSV che assomiglia a questo:È possibile utilizzare read_csv per leggere solo righe specifiche?

TEST 
2012-05-01 00:00:00.203 ON 1 
2012-05-01 00:00:11.203 OFF 0 
2012-05-01 00:00:22.203 ON 1 
2012-05-01 00:00:33.203 OFF 0 
2012-05-01 00:00:44.203 OFF 0 
TEST 
2012-05-02 00:00:00.203 OFF 0 
2012-05-02 00:00:11.203 OFF 0 
2012-05-02 00:00:22.203 OFF 0 
2012-05-02 00:00:33.203 OFF 0 
2012-05-02 00:00:44.203 ON 1 
2012-05-02 00:00:55.203 OFF 0 

e non può sbarazzarsi della stringa "TEST".

E 'possibile verificare se una linea inizia con una data e leggere solo quelle che lo fanno?

risposta

7
from cStringIO import StringIO 
import pandas 

s = StringIO() 
with open('file.csv') as f: 
    for line in f: 
     if not line.startswith('TEST'): 
      s.write(line) 
s.seek(0) # "rewind" to the beginning of the StringIO object 

pandas.read_csv(s) # with further parameters… 
+0

Grazie! Questo funziona. – user1412286

3

Quando si ottiene il row dal csv.reader, e quando si può essere sicuri che il primo elemento è una stringa, quindi è possibile utilizzare

if not row[0].startswith('TEST'): 
    process(row) 
0

Un'altra opzione, dato che ho appena incontrato questo problema anche:

import pandas as pd 
import subprocess 
grep = subprocess.check_output(['grep', '-n', '^TITLE', filename]).splitlines() 
bad_lines = [int(s[:s.index(':')]) - 1 for s in grep] 
df = pd.read_csv(filename, skiprows=bad_lines) 

è meno portabile di @ di (leggi: probabilmente non funziona su Windows) eumiro e richiede la lettura del file per due volte, ma ha il vantaggio che non è necessario memorizzare l'intero contenuto del file in memoria.

Ovviamente potreste fare la stessa cosa di grep in Python, ma probabilmente sarebbe più lento.

Problemi correlati