2016-11-19 4 views
-1

私は、電子回路を記述したテキストファイルとそれに付随するいくつかのことがあります。私はファイルを別の単位に分割する単純なPythonコードを作成しました。必要な場合にはさらに解析することができます。 - のようなコメント行Pythonでのファイル解析の機能的アプローチ

subckt xxx ..... 
... 
... 
ends xxx ... 

は私がパースまたはアウト残しているこれらの「テキストブロック」と他のもののいくつかあります: シミュレーション言語の構文は次の行に含まれるように、これらのユニットを定義します。これを実現するために

、私は次のコアを使用します。それについての素晴らしい事は、そのiter(f)事実である

with open('input') as f: 
    for l in iter(f): 
     if 'subckt' not in l: 
      pass 
     else: 
      with open('output') as o: 
       o.write(l) 
       for l in iter(f): 
        if 'ends' in l: 
         o.write(l) 
         break 
        else: 
         o.write(l) 

(簡単に見落としがあるかもしれない、実際のコードを貼り付けることはできません)

subcktends行に達したときに内側のループから脱出したときにファイルをスキャンし続けるので、外側のループはその時点以降も続けて、後続の行にトークンsubcktの新しい出現を検索します。

if/then句のフォレストをより機能的なものに変換する方法、つまり単に値(ファイルの行または行)を生成する「純粋な」関数に基づいて変換する方法に関する提案や指針を探しています。最終的な結果をもたらす。

具体的には、generator\map\filtersubcktトークンを見つけたという事実に基づいて、実際に別の行を生成する必要があるという事実にどのようにアプローチするかはわかりません。 私は、フォームのfilterと考えることができます:

line = filter(lambda x: 'subckt' in x, iter(f)) 

が、私が望むのに対し、これはもちろん、唯一、私にその文字列が存在する行を与える - その瞬間から上 - yieldすべてラインまでendsトークンが見つかりました。 これは再帰で処理する必要がありますか?またはitertools.teeですか?

私が望むのは、何らかの形の状態を持つことです。つまり、「あなたはサブックに到達しました」が、実際の状態変数に頼ることなく機能的なパラダイムに逆らうことです。

答えて

2

これがあなたが探しているものかどうか不明です。 blocks(f)はファイルfのブロックを生成するジェネレータです。各ブロックは、 'subckt'と 'ends'の間の行のイテレータです。それらの2行をブロックに含めるには、_blocksでもう少し作業する必要があります。しかし、私は、これはあなたのアイデアを与える願っています:

def __block(f): 
    while 'subckt' not in next(f): pass # raises StopIteration at EOF 
    return iter(next(iter([])) if 'ends' in l else l.strip() for l in f) 

def blocks(f): 
    while 1: yield __block(f) # StopIteration from __block will stop the generator 

f = open('data.txt') 
for block in blocks(f): 
    # process block 
    for line in block: 
     # process line 

next(iter([])) ifは理解/発電機を終了する少しハックです。

+0

ありがとう@schwobaseggl、これは確かに私が求めていたものです。 私はaswerとして投稿する若干異なる解決策があります:あなたがそれについてコメントしていただければ幸いです。 –

0

この回答にもコメントを聞いて、まだ、非常に熱心な作品:私はまだうまくできなかった

from itertools import takewhile, dropwhile 

def start(l): return 'subckt' not in l 
def stop(l): return 'ends' not in l 

def sub(iter):  
    while True:  
     a = list(dropwhile(start,takewhile(stop,iter)))  
     if len(a): 
      yield a 
     else: 
      return 
f = open('file.txt') 
for b in sub(f): 
    #process b 
f.close() 

何か:出力中(endsキーワードを含む)最後の行を囲みます。

関連する問題