是否可以使用read_csv只读取特定行?

时间:2012-05-23 09:53:23

标签: python csv pandas

我有一个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"字符串。

是否可以检查一行是否以日期开头并且只读取那些?

4 个答案:

答案 0 :(得分: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…

答案 1 :(得分:3)

当您从row获得csv.reader,并且当您可以确定第一个元素是字符串时,则可以使用

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

答案 2 :(得分:2)

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

  

skiprows:list-like或integer   要跳过的行号(0索引)或要跳过的行数(int)

传递[0, 6]以使用“TEST”跳过行。

答案 3 :(得分: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上不起作用)并且需要读取文件两次,但其优点是您不必将整个文件内容存储在内存中。

你当然可以和Python中的grep做同样的事情,但它可能会慢一些。