2017-05-01 25 views
1

私は以下のようなテキストファイルを持っています。私は以下の行を抽出したいと思います "パラメータ------>パラメータの感度についてはnwirp_nsmc.senファイルを参照してください。"異なるテキストファイルに書き込むことができます。どうやってやるの?Pythonを使用してテキストファイルから複数の行を抽出する

OPTIMISATION RESULTS 

Covariance matrix and parameter confidence intervals cannot be determined:- 
Some form or regularisation was implemented so these are not applicable. 
Use the PREDUNC7 utility to obtain a full posterior covariance matrix. 
Parameters -----> 
Parameter  Estimated value 

1.hklay1   3.278692E-06 
2.kppt1   4.249307E-07 
3.kppt2   2.849132E-06 
------- 
------- 

See file nwirp_nsmc.sen for parameter sensitivities. 


Observations -----> 

これは私が試したものですが、私のファイルでは機能しません。私はここに何かを逃していることを知っているが、私は今、欠けている部分が何であるか知りません。

新しい抽出

inFile = open('nwirp-1.txt') 
outFile = open('result2.txt', 'w') 
new = [] 
Set = True 
for line in inFile: 
    new.append(line) 
    if line.startswith("Parameters------>"): 
     #---- starts a new data set 
     if Set: 
      outFile.write("".join(new)) 
    elif line.startswith("See file nwirp_nsmc.sen for parameter sensitivities."): 
     Set = False 
     new = [] 
inFile.close() 
outFile.close() 
+0

試しましたか? – Hackaholic

+1

質問にあなたのコードを追加してください – kuro

+0

境界 "**"の外に "パラメータ"はありませんか? Setを使用しないでください。組み込みです。最後に、 'startswith(" ** ")'が始まってそこから開始するのはどうですか? – kabanus

答えて

1

あなたはこのように試すことができます:

f = open("nwirp-1.txt") 

for line in f: 
    if line.strip().startswith("Parameters ----->"): 
     f2 = open('result2.txt', 'w') 
     line = next(f) 
     while not line.strip().startswith("See file"): 
      f2.write(line) 
      line = next(f) 
     f2.close() 
f.close() 

出力は

Parameter  Estimated value 

1.hklay1   3.278692E-06 
2.kppt1   4.249307E-07 
3.kppt2   2.849132E-06 
4.kppt3   1.548621E-06 
+0

あなたの出力は良く見えますが、私はトップラインとボトムラインは必要ありません。これらの行を削除する方法はありますか? –

+0

@BulbulAhmmed更新されたソリューションを確認してください。 – Hackaholic

+0

これは素晴らしいです。どうもありがとう。私はあなたの助けに感謝します –

1

最も簡単な方法は、ファイルとスプリットをダンプすることです:これは1つの中間にある「**」の部分、および「なしその他があると仮定している

with open('myfile') as fd: 
    relevent = fd.read().split("**")[1] 
with open('outfile','w') as fd: 
    fd.write(relevent) 

** "

=====================================

変更された質問

with open('nwirp-1.txt') as inFile, open('result2.txt', 'w') as outFile: 
    writing = False 
    for line in inFile: 
     if line.startswith("Parameters ----->"): 
      writing = True 
     if writing: 
      outFile.write(line) 
     if line.startswith("See file"): 
      writing = False 

注特に設定を使用しない、それはビルトインです。あなたは近づきました、少し修正しました。また、涼しいwith声明に注意してください。closeの必要はありません。

+0

ファイルに**記号がありません。データを抽出する場所を示すために追加しました。誤解して申し訳ありません。 –

+0

私はあなたが完全に変わったのを見ます、私は見ています。 – kabanus

+0

はい。ごめんなさい。これが私の最初の質問です。それで、stackoverflowの動作方法を理解するのに時間がかかりました –

1

あなたはDOTALLフラグを再使用する必要があります。

import re 

myre = re.compile(r"Parameters ----->(.*?)See file ", re.DOTALL) 
parts = myre.findall(text) 

if parts: 
    with open('foo.txt', 'w') as output: 
     for part in parts: 
      print(part, file=output) 
else: 
    print("No match!") 

これが故に?、非貪欲なる再において、複数のブロックが存在し得ることを想定しています。

関連する問題