2017-06-02 9 views
0

情報を収集する多くのデバイスを反復して大きなファイルにデータを出力するプログラムを作成しました。
新しいデバイスからの新しい情報がこのファイルに追加されるため、基本的には10行ごとに同じ情報が(同じではありませんが)同じ情報を持つ大きなファイルです。Pythonを使用して異なる行にある2つの関連する文字列を見つける

私がする必要があるのは、特定の文字列を検索することです(この場合は、大きなファイル内のデータの繰り返しごとに識別目的で使用される特殊文字で作業しました)。特定の識別文字、2行下。ブラウニーは、これが私が探している正しいデータ(つまり、 'バージョン'という単語が含まれているかどうか)を確認できるかどうかを示します。

たとえば、テキストファイルには、次のようになります。

trying 1.1.1.1 
connected to 1.1.1.1 
username: xxxx 
password: xxxx 
>>2001 
issue command y 
y = version         

上記のテキストは、一意の識別子が「>>」の後にリストされて、100回の周りに繰り返されます。私がPythonで行う必要があるのは、テキストを含むファイルを開き、それをループし、 '>>'を見つけて、2行下のバージョンを集めます。私はそれから、「>> 2001 y = version」が '>> 2099 y = version'の途中までループしている様子を画面に表示する必要があります。

+0

上記のテキストファイルはを言う必要があります ' は1.1.1.1 ユーザ名に接続1.1.1.1 しよう:xxxxxは >> 2001 発行コマンドY Y =バージョン :XXXXX password' をあなたのコード、入力例と所望の出力を貼り付けてください –

+0

。投稿のガイドラインhttps://stackoverflow.com/help/how-to-ask – Dalvenjia

+2

@Dalvenjiaを参照してください。URL( 'stackoverflow.com/help/how-to-ask')ではなく、 \ [ask \]と入力すると、コメントに[ask]と表示されます。 \ [mcve \]([mcve])と同じです。 – boardrider

答えて

0

regular expressionは、このための優れたツールです。例:

# you'll want to load this from an actual file instead; 
# I'm just including it as a literal for example 
file_contents = '''trying 1.1.1.1 
connected to 1.1.1.1 
username: xxxx 
password: xxxx 
>>2001 
issue command y 
y = version''' 


# Summary of this regex: find and capture your ">>2001" line, 
# followed by a line that doesn't get captured, followed by a line that gets captured 
matches = re.compile('\n(>>\d+)\n.*\n(.*)\n?').findall(file) 
# matches should now be [('>>2001', 'y = version')] 

for match in matches: 
    print(match[0], match[1])` 

正規表現の素晴らしい世界へようこそ!

あなたがリストにファイルを読み込むことができ、あなたの識別子を探してリストをloopはその後、目的のアイテムを印刷regexpal

+0

両方の返信に感謝します。私はそれと一緒に遊んで何がうまくいくのかを教えてくれるでしょう。私は本当にそれを感謝します! –

+0

ようこそ。 Upvotesと最高の答えを選ぶことは、感謝を示す良い方法です! – waterproof

+0

私は最初の提案と一緒に遊んでいて、私が望むものを提供しているとは言いますが、無限ループに陥ってしまいます。私はループを止めるためにカウンターを置こうとしましたが、私の試みはこれほど成功していませんでした。 –

0

でこの正規表現を試すことができます。たとえば:

コード:

with open('test.txt', 'r') as f: 
    data = f.read().splitlines() 
    for line in data: 
     if line.startswith('>>'): 
      print line, data[data.index(line)+2] 

入力ファイル:

trying 1.1.1.1 
connected to 1.1.1.1 
username: xxxx 
password: xxxx 
>>2001 
issue command y 
y = version 
>>2002 
issue command y 
y = versionx 
>>2003 
issue command y 
y = versionz 

出力:

>>2001 y = version 
>>2002 y = versionx 
>>2003 y = versionz 
+1

'list.index'を避けるために' enumerate'する必要があります。これは大きなファイルでは本当に遅くなります。 –

関連する問題