2016-10-27 17 views
0

だから、私はPythonでcsvで読み込もうとしているテキストファイルを持っていますが、特定の文字列で始まる2行の間に行が必要です。特定の文字列の間にある行だけを読み込むPython

import csv 
with open('path to file','r') as inf: 
    reader = csv.reader(inf, delimiter=" ") 

とを通してちょうどループ私ができるすべてのデータを取得し、リストに追加する:

raw_data=[] 
for row in reader: 
    raw_data.append(row) 

私は私が得ることができます知っている私は私が持っているだけでデータの読み取りに問題を持っていません以下のような何かを実行して、私が欲しいの行:

for row in raw_data: 
    if row[0] == 'string1': 
     begin_idx = raw_data.index(row) 
    elif row[0] == 'string2': 
     end_idx = raw_data.index(row) 
data=[] 
for idx in range(begin_idx+1,end_idx): 
    data.append(raw_data[idx]) 

しかし、私はときにテキストファイルを介してI最初のループすべてを一度にこれを行うことができるように期待していたので、誰もがこれを行うことができる方法上の任意のアイデアを持っている場合それは感謝します。

私が必要とする行のインデックスを探しているのは、これを実行するたびに変更される単なる整数リストであるためです。私が実行するpdfからテキストへの変換はきれいではないので、行のタイトルはその行の実際のデータと一致しません。

+0

* Aside *:2番目のコードスニペットは、 'raw_data = list(reader)'と等価です。 –

+0

また、最後のループの代わりに 'data = raw_data [begin_idx + 1、end_idx]'を実行することもできます。 – xZise

答えて

2

イテレータオブジェクトは、だから、これはあなたが通過することができますin を使用しているとき、彼らはちょうどreaderのようなオブジェクトにnext()を呼び出しているという点でいいですこれは、開始文字列を叩いたときに別々にループすることで、1つの線形パスになります。これを試してください:

import csv 
with open('path to file','r') as inf: 
    reader = csv.reader(inf, delimiter=" ") 

data=[] 
for row in reader: 
    if row[0] == 'string1': 
     for row in reader: 
      if row[0]=='string2': 
       break 
      data.append(row) 
+0

これは、私がやろうと思っていたことに沿ったものですが、実装方法を理解できなかったので、ありがとうございます。 –

+0

問題ありません!そしてメモとして、通常は 'row'のような変数名を再利用/上書きすることに反対しますが、ここでは適切だと思います –

0

あなたのforループに状態変数を導入することができます

data = [] 
copying = False 
for row in reader: 
    if copying: 
     data.append(row) 
    if row[0] == 'string1': 
     copying = True 
    if row[0] == 'string2': 
     copying = False 
+0

'copy'を' False'に戻す代わりにループを '中断 'することもできますが、これは' string1'の前に 'string2'が起こらない場合にのみ有効です。私が誤解していない場合、 'string2'は' data'にあってはいけません。最後の条件を先頭に移動する必要があります。 – xZise

+0

@xZiseはい 'data'に' string2'を入れたくありませんでした。最後の条件を最初に移動するように動作します。 –

関連する問題