私は、電子回路を記述したテキストファイルとそれに付随するいくつかのことがあります。私はファイルを別の単位に分割する単純な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)
(簡単に見落としがあるかもしれない、実際のコードを貼り付けることはできません)
をsubckt
のends
行に達したときに内側のループから脱出したときにファイルをスキャンし続けるので、外側のループはその時点以降も続けて、後続の行にトークンsubckt
の新しい出現を検索します。
if/then
句のフォレストをより機能的なものに変換する方法、つまり単に値(ファイルの行または行)を生成する「純粋な」関数に基づいて変換する方法に関する提案や指針を探しています。最終的な結果をもたらす。
具体的には、generator\map\filter
がsubckt
トークンを見つけたという事実に基づいて、実際に別の行を生成する必要があるという事実にどのようにアプローチするかはわかりません。 私は、フォームのfilter
と考えることができます:
line = filter(lambda x: 'subckt' in x, iter(f))
が、私が望むのに対し、これはもちろん、唯一、私にその文字列が存在する行を与える - その瞬間から上 - yield
すべてラインまでends
トークンが見つかりました。 これは再帰で処理する必要がありますか?またはitertools.tee
ですか?
私が望むのは、何らかの形の状態を持つことです。つまり、「あなたはサブックに到達しました」が、実際の状態変数に頼ることなく機能的なパラダイムに逆らうことです。
ありがとう@schwobaseggl、これは確かに私が求めていたものです。 私はaswerとして投稿する若干異なる解決策があります:あなたがそれについてコメントしていただければ幸いです。 –