2012-05-23 4 views
7

У меня есть CSV-файл, который выглядит следующим образом:Можно ли использовать read_csv для чтения только определенных строк?

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 

и не может избавиться от "TEST" строки.

Можно ли проверить, начинается ли линия с даты и читать только те, которые делают?

ответ

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

Спасибо! Это работает. – user1412286

3

Когда вы получаете row от csv.reader, и когда вы можете быть уверены в том, что первый элемент является строкой, то вы можете использовать

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

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html?highlight=read_csv#pandas.io.parsers.read_csv

SkipRows: список-как или целое число Номера строк для пропуска (0-индексированные) или количество строк для пропуска (int)

Перейдите [0, 6], чтобы пропустить строки с помощью «TEST».

+1

Боюсь, он знает, как выглядят такие строки, а не их индексы. – eumiro

0

Другой вариант, так как я только столкнулся с этой проблемой также:

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) 

Это менее компактен, чем @ eumiro (Прочитано: вероятно, не работает на Windows) и требует чтения файла в два раза, но имеет то преимущество, что вам не нужно хранить все содержимое файла в памяти.

Конечно, вы можете сделать то же самое, что и grep в Python, но это, вероятно, будет медленнее.