2017-02-16 60 views
2

我想從txt輸出文件中提取特定的行。我感興趣的幾行是上面的幾行,在我用來搜索結果的key_string下面有幾行。每個結果的關鍵字符串都是相同的。Python:通過唯一索引引用列表中的每個重複項目

fi = open('Inputfile.txt') 
fo = open('Outputfile.txt', 'a') 

lines = fi.readlines() 
filtered_list=[] 

for item in lines: 
    if item.startswith("key string"): 
     filtered_list.append(lines[lines.index(item)-2]) 
     filtered_list.append(lines[lines.index(item)+6]) 
     filtered_list.append(lines[lines.index(item)+10]) 
     filtered_list.append(lines[lines.index(item)+11])  
fo.writelines(filtered_list) 

fi.close() 
fo.close() 

輸出文件包含第一條記錄的正確行數,但是對於每個可用記錄都乘以。我如何更新索引,以便可以讀取每條記錄?我試圖找到解決方案,但作爲新手程序員,我努力使用枚舉()函數或集合包。

回答

1

首先,如果你說的話到底出了你的代碼(堆棧跟蹤它可能會幫助,它根本不起作用,等等)。無論如何,這是一些想法。你可以嘗試將你的問題分成幾個子問題,以便更容易處理。在這種情況下,讓我們單獨找到收集它們的相關行。

首先,我們找到所有相關行的索引。

key = "key string" 
relevant = [] 
for i, item in enumerate(lines): 
    if item.startswith(key): 
     relevant.append(item) 

enumerate其實很簡單。它接受一個列表,並返回一系列(索引,項目)對。所以,enumerate(['a', 'b', 'c'])返回[(0, 'a'), (1, 'b'), (2, 'c')]

我曾上面寫的可以用一個列表理解來實現:

relevant = [i for (i, item) in enumerate(lines) if item.startswith(key)] 

所以,我們有相關線路的指標。現在,我們收集它們。你對它之前的2行以及它後面的6行和10行以及11行感興趣。如果你的第一行包含密鑰,那麼你有一個問題 - 你真的不想要lines[-1] - 這是最後一項!此外,您需要處理偏移量會超過列表末尾的情況:否則Python將引發一個IndexError

out = [] 
for r in relevant: 
    for offset in -2, 6, 10, 11: 
     index = r + offset 
     if 0 < index < len(lines): 
      out.append(lines[index]) 

你也可以趕上IndexError,但不會爲我們節省很多打字,因爲我們無論如何都要處理負指數。

整個程序是這樣的:

key = "key string" 
with open('Inputfile.txt') as fi: 
    lines = fi.readlines() 

relevant = [i for (i, item) in enumerate(lines) if item.startswith(key)] 
out = [] 
for r in relevant: 
    for offset in -2, 6, 10, 11: 
     index = r + offset 
     if 0 < index < len(lines): 
      out.append(lines[index]) 

with open('Outputfile.txt', 'a') as fi: 
    fi.writelines(out) 
+0

謝謝Ryszard!這正是我正在尋找的。問題是提取的數據只是輸出文件中記錄數量重複的第一條記錄。這是由於python'list.index'方法有一些限制。在python 3.6文檔的'list.index'方法描述下面:「返回的索引是相對於整個序列的開始而不是起始參數計算的。」 – Bart

0

爲了擺脫重複,你可以投入列表設置;例如:

x=['a','b','a'] 
y=set(x) 
print(y) 

將導致: [「一」,「B」]

+0

感謝您的答覆!不過,我需要這些重複項來將它們用作錨點來提取我想要的數據。不幸的是你的回答不會幫助我。 – Bart

相關問題