2012-05-23 16 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

あなたはcsv.readerからrowを取得し、あなたが最初の要素が文字列であることを確認することができたとき、あなたは

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上では動作しません)未満ポータブルだと二回ファイルを読み込む必要が、ファイルの内容全体をメモリに保存する必要がないという利点があります。

もちろん、Pythonでgrepと同じことをすることはできますが、おそらくそれは遅くなるでしょう。

関連する問題