2012-05-23 9 views
7

Ich habe eine CSV-Datei, die wie folgt aussieht:Kann read_csv nur bestimmte Zeilen lesen?

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 

und kann nicht loswerden der "TEST" String.

Ist es möglich zu überprüfen, ob eine Zeile mit einem Datum beginnt und nur diejenigen liest, die das tun?

Antwort

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

Danke! Das funktioniert. – user1412286

3

Wenn Sie erhalten die row vom csv.reader, und wenn Sie sicher sein können, dass das erste Element ein String ist, dann können Sie

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

Eine weitere Option, da ich in dieses Problem nur lief auch:

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 ist weniger tragbar als @ eumiro ist (sprich: wahrscheinlich unter Windows nicht funktioniert) und erfordert die Datei zweimal zu lesen, hat aber den Vorteil, dass Sie nicht den gesamten Dateiinhalt im Speicher ablegen müssen.

Sie könnten natürlich das gleiche wie das Grep in Python tun, aber es wäre wahrscheinlich langsamer.