2016-06-30 6 views
0

複数のファイルから指定されたセクションを取得したい。Python snippet duplicate lines私が選択した

すべての私のファイルは、以下のように構成されたが、差分オブジェクトデータを持っている:

some lines 
ObjectAlias apple 
some lines 
Begin 
some lines 
End 
some lines 
ObjectAlias pear 
some lines 
Begin 
some lines 
End 
... 

は、私は私のファイルの私のリスト、指定された「ObjectAlias」パターンと機能のリストを持っていると仮定します

def dummyFunc (fileList, objList): 
    dummy = "" 

    for file in fileList: 
     with open(file, "r") as infile: 
      Tag = False 
      for line in infile: 
       for obj in objList: 
        if line.find("ObjectAlias " + obj + "\n") !=-1: 
         Tag = True 
        if Tag: 
         dummy += line 
        if line.find("End") != -1: 
         Tag = False 
    return (dummy) 

このコードは、私がこのような結果を与える:

... 
ObjectAlias cherry 
ObjectAlias cherry 
ObjectAlias cherry 
ObjectAlias cherry 
Begin 
Begin 
Begin 
Begin 
same lines 
same lines 
same lines 
same lines 
End 
... 

これは私が期待したものである:

... 
ObjectAlias apple 
some lines 
Begin 
some lines 
End 
ObjectAlias cherry 
some lines 
Begin 
some lines 
End 
... 

私はコードを間違っていましたか? 私がテストするので、同様のコードは1つのファイルと1つのオブジェクトでうまく動作しますが、リストを入力として使用しても機能しません。objListに5つの項目がある場合、結果は各行の5倍になります。

助けを歓迎します。

EDIT:

より明確を説明FILEA:

some lines 
ObjectAlias apple 
some lines 
Begin 
some lines about apple 
End 
some lines 
ObjectAlias pear 
some lines 
Begin 
some lines about pear 
End 
some lines 
ObjectAlias orange 
some lines 
Begin 
some lines about orange 
End 
some lines 

FILEB:

some lines 
ObjectAlias lemon 
some lines 
Begin 
some lines about lemon 
End 
some lines 
ObjectAlias peach 
some lines 
Begin 
some lines about peach 
End 
some lines 
ObjectAlias tomato 
some lines 
Begin 
some lines about tomato 
End 
some lines 

が新しいファイルに梨や桃をフィルタリングしたいので、それは次のとおりです。

ObjectAlias pear 
Begin 
some lines about pear 
End 
ObjectAlias peach 
Begin 
some lines about peach 
End 
iownthegameの助けを借りて

、私はに私のコードを変更:

def dummyFunc (fileList, objList): 
    dummy = "" 

    for file in fileList: 
     with open(file, "r") as infile: 
      Tag = False 
      for line in infile: 
       for obj in objList: 
        objString = "ObjectAlias " + obj 
        if objString in line: 
         dummy += line 
         break 
        elif "Begin" in line: 
         Tag = True 
         break 
        elif "End" in line: 
         dummy += line 
         Tag = False 
         break 
       if Tag: 
        dummy += line 
    return (dummy) 

income = ["e:/FileA", "e:/FileB"] 
filter = ["pear", "peach"] 
with open("e:/Result", "w") as f: 
    f.write(dummyFunc(income, filter)) 

しかし、私はこの出力を得る:

Begin 
some lines about apple 
End 
ObjectAlias pear 
Begin 
some lines about pear 
End 
Begin 
some lines about orange 
End 
Begin 
some lines about lemon 
End 
ObjectAlias peach 
Begin 
some lines about peach 
End 
Begin 
some lines about tomato 
End 

私は絶対初心者です、私が間違って何をしましたか?手伝ってくれてありがとう。

+3

どのような結果が期待されますか? – AbrahamB

答えて

0

あなたがそれぞれにobjを見つけるのではなく、出力を見つけ、連結続けるときは、breakを持っている必要があり

更新:使用すると、1つを必要とするので、あなたは、ObjectAliasの間に線をフィルタリングして開始する必要がありますので、処理中に何が行われたかを記録するには、stateを入力します。

私は、別の状態を記録するために、あなたのタグを変更するには、一度ラインObjectAliasを満たし、なしタグを初期化し、一度行を開始満たすstartタグに行き、beginタグに行き、一度終了ラインを満たしますタグなしに進みます。だから、もしあなたがbeginタグよりも早くいくつかの行に会ったら、私たちはそれらを印刷しません。別の状況は、私たちが会う時です開始行または終了行前前にObjectAlias行開始、我々はまたカウントしません。

このソリューションが役に立ちますようお願いいたします。

def dummyFunc (fileList, objList): 
    dummy = "" 

    for file in fileList: 
     with open(file, "r") as infile: 
      Tag = None 
      for line in infile: 
       for obj in objList: 
        objString = "ObjectAlias " + obj 
        if objString in line: 
         Tag = "start" 
         dummy += line 
         break 
        elif "Begin" in line: 
         if Tag == "start": 
           Tag = "begin" 
         break 
        elif "End" in line: 
         if Tag == "begin": 
           Tag = None 
           dummy += line 
         break 
       if Tag == "begin": 
        dummy += line 
    return (dummy) 
+0

:大きな助けとなりました。好奇心、もし私がObjectAliasとbewteen線の両方を必要としない場合は、どちらも可能ですか? – Tian

+0

いいえ、各セクションの最後に「終了」行はありません。 – Tian

+0

期待される出力は?あなたが望むのは実際に元のファイルに似ています – iownthegame

関連する問題