2017-06-19 10 views
0

以下の例のデータのようなデータがテキストファイルにあります。私がしたいのは、テキストファイルを検索し、 "SpecialStuff"と次の ";"の間のすべてを返すことです。私は非常に任意のヒントは非常に高く評価されているので、Pythonにはかなり新しいです。Pythonでテキストを解析する

Example Data: 

stuff: 
    1 
    1 
    1 
    23 

]; 

otherstuff: 
    do something 
    23 
    4 
    1 

]; 

SpecialStuff 
    select 
     numbers 
     ,othernumbers 
     words 
; 

MoreOtherStuff 
randomstuff 
@#123 


Example Out Put: 

select 
     numbers 
     ,othernumbers 
     words 

答えて

1

あなたがこの試すことができます:

select 
    numbers 
    ,othernumbers 
    words 

このコードを向上させることができます。

file = open("filename.txt", "r") # This opens the original file 
output = open("result.txt", "w") # This opens a new file to write to 
seenSpecialStuff = 0 # This will keep track of whether or not the 'SpecialStuff' line has been seen. 
for line in file: 
    if ";" in line: 
     seenSpecialStuff = 0 # Set tracker to 0 if it sees a semicolon. 
    if seenSpecialStuff == 1: 
     output.write(line) # Print if tracker is active 
    if "SpecialStuff" in line: 
     seenSpecialStuff = 1 # Set tracker to 1 when SpecialStuff is seen 

がこれは含まれていresult.txtという名前のファイルを返します!これは宿題の可能性が高いので、これをより効率的にする方法についてもっと研究したいと思うでしょう。うまくいけば、それはあなたのための便利な出発地になることができます!

乾杯!

EDIT

あなたは、具体的ラインを読むためのコードを望んでいた場合は、「SpecialStuff」(代わりに「SpecialStuff」を含む行の)、あなたは簡単に文がそれらをより具体的にするために、「場合」変更することができます:

file = open("my.txt", "r") 
output = open("result.txt", "w") 
seenSpecialStuff = 0 
for line in file: 
    if line.replace("\n", "") == ";": 
     seenSpecialStuff = 0 
    if seenSpecialStuff == 1: 
     output.write(line) 
    if line.replace("\n", "") == "SpecialStuff": 
     seenSpecialStuff = 1 
+0

ありがとう、これは私が探していたものに本当に近いです。唯一の問題は、 "abcSpecialStuffpdq"のような文字列を持つコードの部分があるため、それに続くすべてを取得していることです。文字列 "SpecialStuff"に従うだけで、コードを変更することができますか? – user3476463

+0

"if"ステートメントをif if line.replace( "\ n"、 "")== "SpecialStuff":とすると、正確にSpecialStuffを持つ行だけがトラッカーを "1"にするトリガー!あなたはそれが特定の出来事を見つけるだけなら、それは他の行についても行うことができます! – cosinepenguin

+0

私はそれを反映する答えを編集しました! "abcSpecialStuffpdq"に含まれている情報を後で取得する必要がある場合は、別のif文を追加してコードが認識できるようにする必要があります。 – cosinepenguin

0
with open('path/to/input') as infile, open('path/to/output', 'w') as outfile: # open the input and output files 
    wanted = False # do we want the current line in the output? 
    for line in infile: 
     if line.strip() == "SpecialStuff": # marks the begining of a wanted block 
      wanted = True 
      continue 
     if line.strip() == ";" and wanted: # marks the end of a wanted block 
      wanted = False 
      continue 

     if wanted: outfile.write(line) 
0

そのためstr.split()を使用しないでください - str.find()は十分以上です。

parsed = None 
with open("example.dat", "r") as f: 
    data = f.read() # load the file into memory for convinience 
    start_index = data.find("SpecialStuff") # find the beginning of your block 
    if start_index != -1: 
     end_index = data.find(";", start_index) # find the end of the block 
     if end_index != -1: 
      parsed = data[start_index + 12:end_index] # grab everything in between 
if parsed is None: 
    print("`SpecialStuff` Block not found") 
else: 
    print(parsed) 

これは新しい行と他の空白を含む、これら二つの間すべてをキャプチャすることを忘れないでください - あなたは、さらにあなたがそれらをしたくない場合は、先頭と末尾の空白を削除するparsed.strip()を行うことができます。