2016-12-03 78 views
0

我必須從file1中基本去掉一段文本。該文件1是巨大的數千行(〜3GB大小)。塊看起來如下,使用python從文件中剝離一段文本

line 1 
line 2 
<pattern1> { 
... 
... 
... 
} 
<pattern2> { 
... 
... 
... 
} 

我基本上是想在大括號之間寫出線的塊「{}」中的文件,我試圖模式匹配的每個條目(模式1, pattern2)讀取該行時。我通過另一個文件(file2)給出了一個模式列表。 所以我想到了我的邏輯(不是代碼,但想法)下面的東西,但沒有信心。有人可以澄清什麼是解決這個問題的最好方法嗎?

  • 打開file2並獲取要匹配的字符串模式。
  • 打開file1並開始搜索file2中每個字符串模式的行。
  • 一旦找到,啓用該標誌並開始將大括號之間的行寫入輸出文件(比如file3)。
  • 一旦遇到大括號,取消設置標誌並停止寫入文件(file3)。
+1

file2中只有一個模式嗎? – Prune

+0

是否有嵌套的大括號? – dawg

+0

不是在file2中有多個模式,這就是爲什麼我把它稱爲pattern1/pattern2(例如,像100個這樣的模式),是的,我試圖寫出的塊內嵌套大括號。 – Sreeder

回答

0

您的建議很容易理解和實施。這也便於調試,維護和更新。是的,這是一個很好的使用方法。

start_pattern_list = # Make this a list of all the patterns from file2 
stop_pattern = "}\n" 
out_flag == False 
for line in <input file>: 
    if '<' in line: 
     if any(p in line for p in start_pattern_list): 
      out_flag = True  # Turn on output 
    if out_flag: 
     out_file.write(line) 
    if stop_pattern in line: 
     out_flag = False # Turn off output 

這適用於簡單文件:沒有嵌套大括號,輸入觸發(圖案)出現僅作爲圖案(未嵌入在括號內)。

+0

非常感謝您的快速回復。但我有一個後續問題。看看解決方案,邏輯似乎是基於來自file2的模式一遍又一遍地遍歷大文件(file1)。所以基本上我正在多次閱讀這個龐大的文件。這可以嗎?你建議其他運行時間的高效代碼嗎? – Sreeder

+0

100個文件讀取不好。相反,請列出模式;比較每個輸入線。更好的是,如果你能找到一個更好的模式觸發器,比如我寫入更新的「小於」。 – Prune

+0

我試圖擴大上述代碼的情況下,當我的搜索塊內嵌套大括號。所以我試圖實現一個找到前進和後退大括號的計數器。當這些差異達到0時,我停止錄製以寫入文件。但是我不能有效地將這個邏輯轉換成代碼。您能否詳細說明如果我們基於大括號而不是固定的開始和停止模式解析文本塊,該方法將如何? – Sreeder

相關問題