2017-10-15 9 views
0

私はissuseを持っています解決できないようです。これが重複していても真実の答えに遭遇したことがないなら、謝罪してください。私は、テキストのブロックで情報を表示する設定ファイルから特定の情報を抽出しています。見出しを付けずに特定のブロックだけを出力する必要があります。ここで 特定のヘッダの後のPython 3.xの印刷番号

# output could containmultiple headers, and lines, or no lines per header this is an example of what could be present but it is not absolute. 

header1 
------- 
line1 
line2 
line3 # can be muiplies availables or known 

header2 
------- 
line1 
line2 
line3 # can be muiplies availables or known 

header3 
------- 

header4 
------- 
line1 
line2 
line3 # can be multiple linnes or none not known 

は、私が始めたが、第2のループブールに貼り付けコードです:だから例えば(下のテキスト形式の)私はヘッダ2以下の情報ではなく、何も過去ヘッダ3をキャプチャしたいと思いますまたはそのヘッダブロックの行のみを印刷するためのロジック:

Raw_file = "scrap.txt" 
scrape = open(Raw_file,"r") 


for fooline in scrape: 

     if "Header" in fooline: 
       #print(fooline) # prints all lines 
        #print lines under header 2 and stop before header 3 



scrape.close() 

答えて

2

の印刷を制御するブール値をオン/オフするためにヘッダー行の検出を使用する:

提供完全例えばデータを含む example.txt

RAW_FILE = "scrap.txt" 

DESIRED = 'header2' 

with open(RAW_FILE) as scrape: 

    printing = False 

    for line in scrape: 

     if line.startswith(DESIRED): 
      printing = True 
     elif line.startswith('header'): 
      printing = False 
     elif line.startswith('-------'): 
      continue 
     elif printing: 
      print(line, end='') 

OUTPUT

> python3 test.py 
line1 
line2 
line3 # can be muiplies availables or known 

> 

必要に応じて調整します。

+0

私もラインでオブジェクトを印刷したい場合、これは、優れたおかげで、どのように私は希望それを行う。私はそれを分割し、行[0]を印刷して '3'を得ようとしました。私は何かを理解していないかもしれないかもしれません。 – onxx

0

あなたがheader2header3コンテンツのマッチングに基づいて、開始及び回収を停止フラグを設定することができます。

f = "example.txt" 
scrape = open(f,"r") 

collect = 0 
wanted = [] 

for fooline in scrape: 
    if "header2" in fooline: 
     collect = 1 
    if "header3" in fooline: 
     collect = 2 

    if collect == 1: 
     wanted.append(fooline) 
    elif collect == 2: 
     break 

scrape.close() 

wanted出力:

['header2\n', 
'-------\n', 
'line1\n', 
'line2\n', 
'line3 # can be muiplies availables or known\n', 
'\n'] 
0

最初に、flag~Falseと設定します。行がheader2で始まるかどうか確認してください。 Trueの場合は、flagと設定します。行がheader3で始まる場合は、flagFalseに設定します。

flagが設定されている場合は、行を印刷します。

Raw_file = "scrap.txt" 
scrape = open(Raw_file,"r") 
flag = False 

for fooline in scrape: 
    if fooline.find("header3") == 0: flag = False # or break 
    if flag: 
     print(fooline) 
    if fooline.find("header2") == 0: flag = True 
scrape.close() 

出力:

------- 

line1 

line2 

line3 # can be muiplies availables or known 
1

あなたがブロックにこれを破るために正規表現を使用して検討することができます。

ファイルは一度だけで、それをすべて読み、のような正規表現を使用し、管理しやすいサイズである場合は、次のブロックにそれを破るために

(^header\d+[\s\S]+?(?=^header|\Z)) 

Demo

次に、あなたのPythonコードは(ヘッダ間の任意のテキストを取得するには)次のようになります。

import re 

with open(fn) as f: 
    txt=f.read() 

for m in re.finditer(r'(^header\d+[\s\S]+?(?=^header|\Z))', txt, re.M): 
    print(m.group(1)) 

ファイルには、一口で読みたいものよりも大きい場合、あなたがmmapを使用することができます正規表現とかなりのサイズのブロックでファイルを読む。

あなただけの単一のヘッダを探しているなら、それも簡単です:

m=re.search(r'(^header2[\s\S]+?(?=^header|\Z))', txt, re.M) 
if m: 
    print(m.group(1)) 

Demo of regex

関連する問題