2012-05-23 6 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의 (읽기 : 아마 윈도우에서 작동하지 않습니다)보다 작은 휴대용이고 두 번 파일을 읽는 필요, 그러나 전체 파일 내용을 메모리에 저장할 필요가 없다는 장점이 있습니다.

당신은 당연히 파이썬에서 grep과 같은 일을 할 수 있지만 아마 느릴 것입니다.

관련 문제