2016-03-23 5 views
1

Pythonを使用して、特定のクエリ用の何千ものテキストファイルを検索するフィルタを作成しています。これらのテキストファイルはいくつかのセクションで構成され、すべてが一貫した書式設定を持つわけではありません。区切り文字を使用してファイルから変数に複数行を保存する

with open(some_file, 'r') as r: 
    for line in r: 
     if "DESCRIPTION OF RECORD" in line: 
      record = line 

:「RECORD OF DESCRIPTION」と呼ばれるテキストファイルのセクションで、私は変数に文字列を格納するために、このような何かをやっていたので、私は、これらの各セクションは、特定の基準をチェックしたいですこれはほとんどのファイルでうまくいきますが、ファイルの中には改行があるため、セクション全体が変数に格納されません。変数に格納されている行数を制御するためにデリミタを使用する方法を知りました。私は区切り文字として次のセクションの "CORRELATION"というタイトルを使用します。何か案は?ファイルの

例の構造は、次のようになります。私はあなたの例のテキストの代わりに、ファイルを使用する場合は

import re 

# I assume you have a list of all possible sections 
sections = [ 
    'CLINICAL HISTORY', 
    'MEDICATIONS', 
    'INTRODUCTION', 
    'DESCRIPTION OF THE RECORD', 
    'IMPRESSION', 
    'CLINICAL CORRELATION' 
] 

# Build a regexp that will match any of the section names 
exp = '|'.join(sections) 

with open(some_file, 'r') as r: 
    contents_of_file = r.read() 
    infos = list(re.split(exp, contents_of_file)) # infos is a list of what's between the section names 
    infos = [info.strip('\n :') for info in infos] # let's get rid of colons and whitespace in our infos 
    print(infos) # you don't have to print it :) 

CLINICAL HISTORY: Some information. 
MEDICATIONS: Other information 
INTRODUCTION: Some more information. 
DESCRIPTION OF THE RECORD: Some information here.... 
another line of information 
IMPRESSION: More info 
CLINICAL CORRELATION: The last bit of information 
+0

ファイルの表示例を教えてください。 –

+0

問題はない、私はやった。ありがとうございました。 –

+0

ありがとう、答えに取り組んで:) –

答えて

1

あなたはそのような組み込みreモジュールを使用することができますそれは次のようなものを印刷します:

['', 'Some information.', 'Other information', 'Some more information.', 'Some information here....\nanother line of information', 'More info', 'The last bit of information'] 

最初の要素が空ですが、あなたは、単にそうすることによってそれを取り除くことができます。

infos = infos[1:] 

ところで、私たちはに関する情報を扱ういる行をマージする場合は、1に、それはおそらくきれいになり、かつ確実に、より効率的な(多分少し少なく分かりやすい)のようになります。

infos = [info.strip('\n :') in re.split(exp, contents_of_file)][1:] 
+0

私が投稿した最初のバージョンは、タイプミスのために動作しなかった、私はそれを編集しました。だからあなたが問題を抱えているなら、新しいものを使ってみてください。 –

+0

さて、私は少しこれを試してみましょう!ありがとうございました。 –

1

あなたが見つけるセクションがわからない場合は、ここで働いているようだバージョンです、 aテキストはあなたの例のようにフォーマットされて長いようだ:dictionnaryを構築する上で、タプルのリストを構築するか、正規表現を使用した上で勝利を開始するようだが、

import itertools 

text = """ 
CLINICAL HISTORY: Some information. 
MEDICATIONS: Other information 
INTRODUCTION: Some more information. 
DESCRIPTION OF THE RECORD: Some information here.... 
another line of information 
IMPRESSION: More info 
CLINICAL CORRELATION: The last bit of information 
""" 

def method_tuple(s): 
    # sp holds strings which finish with the section names. 
    sp = s.split(":") 
    # This line removes spurious "\n" at both end of the strings in sp. 
    # It then splits them once at "\n" starting from their end, effectively 
    # seperating the sections and the descriptions. 
    # It builds a list of strings alternating section names and information. 
    fragments = list(itertools.chain.from_iterable(p.strip("\n").rsplit("\n", 1) for p in sp)) 
    # You can now build a list of 2-uples. 
    pairs = [ (fragments[i*2],fragments[i*2+1]) for i in range(len(fragments)//2)] 
    # Or you could build a dict 
    # pairs = { fragments[i*2]:fragments[i*2+1] for i in range(len(fragments)//2)} 
    return pairs 

print(method_tuple(text)) 

タイミングはイリヤの正規表現のバージョンを比較したが、ほぼ同じです10億ループのサンプルテキスト...

+0

セクション内にコロンがない場合にのみ機能します。 (あるものはないと思いますか?)例として、最初の行を '' Clinical History:Was ill:はい.''に変更し、キーはvaueで場所を切り替えるでしょう。しかし、できるなら、それは良い答えです。 –

+0

実際、それは私が「限り...」と言っていたものです。実際には、ソーステキストが信頼できない場合はこれをお勧めしません。シンプルなタイプミス(コロンが間違っている場合)は、それを壊す可能性があります。検索対象を知っているため、信頼できないソースに適したバージョンとなっています。 – daragua

+0

コメントを書いたときにこれが見えないのは残念です。ちなみに、私の「最適化」バージョン(3行の代わりに1行、2行作成しない)を使用すると、それはもっと速くなるでしょうか? –

0

私は、この索引を使用して別の解決策を見つけました。最初にチェックファイルを開き、そのf.read()の内容をinfoという変数に格納しました。私はこれをした:

私は効率的なメモリとスピードの賢明さはわかりませんが、この方法も同様に働いた。 with open(...)を複数回使用する代わりに、infoという変数にすべてを格納してから、そのすべてを実行する方が良いかもしれません。

関連する問題