【问题标题】:Stripping a block of text from a file using python使用python从文件中剥离一段文本
【发布时间】:2016-12-03 00:13:50
【问题描述】:

我基本上必须从 file1 中删除一段文本。 file1 包含数千行(约 3GB 大小)。该块如下所示,

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

我基本上是在尝试写出文件中大括号“{}”之间的行块,并且在读取该行时尝试为每个条目(pattern1、pattern2)进行模式匹配。我通过另一个文件(file2)给出了模式列表。 因此,我正在为我的逻辑(不是代码,而是想法)考虑类似下面的内容,但没有信心。有人可以澄清解决此问题的最佳方法吗?

  • 打开file2,获取要匹配的字符串模式。
  • 打开 file1 并开始从 file2 中搜索字符串模式的每一行。
  • 找到后,启用该标志并开始将大括号之间的行写入输出文件(例如 file3)。
  • 一旦遇到右大括号,取消设置标志并停止写入文件 (file3)。

【问题讨论】:

  • file2 中只有一种模式吗?
  • 有嵌套大括号吗?
  • 不,file2 中有多个模式,这就是为什么我将其称为 pattern1/pattern2(例如 100 个这样的模式),是的,在我试图写出的块中有嵌套的大括号。

标签: python


【解决方案1】:

您的提案易于理解和实施。这也使得调试、维护和更新变得容易。是的,这是一个很好的使用方法。

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

这适用于简单文件:没有嵌套大括号,输入触发器(模式)仅显示为模式(未嵌入大括号内)。

【讨论】:

  • 非常感谢您的快速回复。但我有一个后续问题。查看解决方案,逻辑似乎是根据 file2 中的模式一次又一次地迭代大文件(file1)。所以基本上我正在多次阅读巨大的file1。那样可以么?您是否建议任何其他运行时高效的代码?
  • 100 个文件读取不好。相反,列出模式;将每个与输入行进行比较。如果您能找到更好的模式触发器,那就更好了,例如我在更新中编码的“小于”。
  • 当我的搜索块中有嵌套大括号时,我试图扩展上面的代码。所以我试图实现一个计数器来找到一个前后支撑。当它们的差异为 0 时,我停止录制以写入文件。但我无法有效地将这个逻辑转换成代码。如果我们根据大括号而不是固定的开始和停止模式来解析文本块,您能否详细说明该方法将如何?
  • 这应该是另一个问题。请包含不适合您的代码,我们会试一试。
猜你喜欢
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 2015-10-28
  • 2022-12-27
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多