2012-05-23 23 views
7

Tengo un archivo csv que tiene este aspecto:¿Es posible usar read_csv para leer solo líneas específicas?

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 

y no puede deshacerse de la cadena "TEST".

¿Es posible verificar si una línea comienza con una fecha y solo leer las que sí la tienen?

Respuesta

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

¡Gracias! Esto funciona. – user1412286

3

Al obtener el row del csv.reader, y cuando se puede estar seguro de que el primer elemento es una cadena, entonces usted puede utilizar

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

Otra opción, ya que me acabo de encontrar con este problema también:

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) 

es menos portátil que de @ (es decir: probablemente no funciona en Windows) eumiro y requiere leer el archivo dos veces, pero tiene la ventaja de que no tiene que almacenar todo el contenido del archivo en la memoria.

Por supuesto, podría hacer lo mismo que grep en Python, pero probablemente sería más lento.

Cuestiones relacionadas