2017-06-02 29 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次重複,用後「>>」被列出的唯一標識符。我需要做的是用文本打開文件,遍歷它,找到'>>'並收集下面列出的兩行。然後我需要在屏幕上以「>> 2001 =版本」循環顯示「>> 2099 y = version」的方式打印它們。

+0

的文本文件,上面應該說 ' 試圖1.1.1.1 連接到1.1.1.1 用戶名:XXXXX 密碼:XXXXX >> 2001年 問題命令Ÿ Y = 版' –

+0

請粘貼代碼,輸入例子,所需的輸出。請參閱發佈指南,https://stackoverflow.com/help/how-to-ask – Dalvenjia

+2

@Dalvenjia,請注意,而不是URL('stackoverflow.com/help/how-to-ask'),你可以鍵入\ [ask \],它將在註釋中顯示爲[問]。 \ [mcve \]([mcve])相同。 – boardrider

回答

0

A 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])` 

歡迎來到精彩的正則表達式世界!

您可以在regexpal

+0

謝謝你的回覆。我會玩弄它,讓你知道什麼是有效的。我真的很感激 ! –

+0

不客氣。 Upvotes和選擇一個最佳答案是很好的方式來表示感謝! – waterproof

+0

我會說,我玩的第一個建議,它確實提供了我想要的,但它陷入了無限循環。我試圖設置一個計數器來阻止循環,但是我迄今爲止的嘗試都沒有成功。 –

0

與此正則表達式實驗中,你可以在列表中尋找你的標識然後打印所需的項目文件讀入到一個列表和loop。例如:

代碼:

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

你應該'enumerate'來避免'list.index'.這對於大文件來說確實很慢。 –

相關問題