2017-04-24 127 views
1

我有一個Python腳本,我試圖過濾一些文本文件並將它們與另一個文本文件進行比較,但是我正在努力尋找解決方案。通過Python中的文本列表中的值進行過濾

below | 1 

above | 2 

above | 3 

above | 4 

above | 5 

below | 6 

below | 7 

below | 8 

below | 9 

below | 10 

below | 11 

below | 12 

above | 13 

below | 14 

below | 15 

below | 16 

below | 17 

below | 18 

below | 19 

below | 20 

below | 21 

... 

我有這個文件列出了視頻幀以及它們是否高於或低於定義的閾值。

此外,我有一個'以上'的閾值框架,以及一個用戶定義的值標記(x,y或z)給每個。不幸的是,這個列表中的數字並不對應於上面或下面的初始幀號,而只是一個編號列表。

y | 1 
x | 2 
x | 3 
y | 4 
z | 5 
z | 6 
y | 7 
z | 8 
y | 9 
y | 10 
x | 11 
x | 12 
y | 13 
x | 14 
x | 15 
x | 16 
x | 17 
x | 18 
y | 19 
x | 20 
z | 21 

我想結合這兩種使得上述幀的X,Y或Z值替換「上面」標籤中的其他腳本,例如:

below | 1 

y | 2 

x | 3 

x | 4 

y | 5 

below | 6 

below | 7 

below | 8 

below | 9 

below | 10 

below | 11 

below | 12 

z | 13 

below | 14 

below | 15 

below | 16 

below | 17 

below | 18 

below | 19 

below | 20 

below | 21 

不過,我可以我不知道如何遍歷列表來實現這一目標。我應該將值存儲在字典中並迭代這些值嗎?任何幫助將非常感激。我已經使用了一些for循環和開放的語句來嘗試它試圖,但我無法通過它讓我的頭一輪如何遍歷:

with open((selectedvideostring + 'combinedfiles.txt'), 'w') as combinedfile: 
    with open((selectedvideostring + 'aboveorbelow.txt'), 'r') as aboveorbelowfile: 
     for line in aboveorbelowfile: 
      if 'above' in line: 
       with open((selectedvideostring + 'xyzfile.txt'), 'r') as xyzfile: 
        for line in xyzfile: 
         if 'x' in line: 
          combinedfile.write("x" + '|' + str(int(cap.get(1)))) 

         elif 'y' in line: 
          combinedfile.write("y" + '|' + str(int(cap.get(1)))) 

         if 'z' in line: 
          combinedfile.write("z" + '|' + str(int(cap.get(1)))) 

      elif 'below' in line: 
       combinedfile.write("below" + '|' + str(int(cap.get(1)))) 

謝謝!

+1

什麼你嘗試了嗎? – Netwave

+0

請將這些文件的_content_粘貼到您的問題中,以便我們不必重新輸入所有內容以測試可能的解決方案。 –

+0

現在就做,致歉! – KittenMittons

回答

1

而不是打開和迭代外部上方或下方文件循環內的xyz文件,您應該一次打開這兩個文件。文件是迭代器,因此您可以使用for循環迭代上面或下面的文件中的行,並使用next只要遇到「上面」條目就從xyz文件中獲取下一行。

with open("aboveorbelow.txt") as aob, open("xyzfile.txt") as xyz: 
    for line in aob: 
     if line.startswith("above"): 
      ab, c = line.split(" | ") 
      d, _ = next(xyz).split(" | ") 
      print(" | ".join((d, c))) 
     elif line.startswith("below"): 
      print(line) 

(使用print用於測試的簡單,但當然有一個輸出文件相同的作品。)

+0

感謝您的幫助!一個小問題,在我的程序中執行代碼我得到一個錯誤,讀'StopIteration',將錯誤拋在行'd,_ = next(xyz).split(「|」)' – KittenMittons

+0

@KittenMittons在這在第二個文件中沒有足夠的'xyz'值。如果存在可用的默認值,例如,可以使用具有默認值的'next'。 'next(xyz,「UNKNOWN | 0」)。split(「|」)'。 –

+0

非常感謝 - 停止了StopIteration問題 - 當我使用上述那些打印語句時,它完全按照我的要求輸出,但是當我嘗試將這些行寫入新的輸出文件時,它完成且沒有錯誤,但沒有文件存在 - 我將添加我現在使用的代碼作爲原始問題中的編輯實現,我必須做出錯誤 – KittenMittons

相關問題