2016-12-03 42 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

相关问题