【问题标题】:Deleting the text preceeding a given sentence删除给定句子之前的文本
【发布时间】:2015-09-03 12:08:11
【问题描述】:

我正在处理一个包含大量生物数据的文件,我的输入文件看起来像,

Start
blah
blah
blah
blah
blah
5'UTR
IMPORTANT STRING
blah
blah
//

Start
blah
blah
blah
5'UTR
IMPORTANT STRING
blah
blah
blah
//

.... 以此类推,这种情况发生了大约 4k 次。现在的挑战是检查重要字符串是否包含“NO information”,如果它确实删除整个段落(从开始到 //),如果没有将整个内容写入新文件。

我面临的问题是“5'UTR”在我这样做时未被识别为关键字, 对于关键字在行 另外我似乎无法删除整个段落。 我如何在python中编写功能代码

【问题讨论】:

  • 我不太清楚你到底想做什么,我已经读了你的帖子 5 次了,也许只是我......
  • 将所需的段落写入新文件相当容易。在您阅读时从输入文件中删除不需要的段落很困难,但我不明白您为什么要这样做,因为当您处理完输入文件后,新文件将只包含所需的段落。

标签: python file text file-io data-analysis


【解决方案1】:

我不会读取整个文件并对其执行正则表达式,而是分块读取它,一次一条记录,然后yield 它。 Yield 是 Python 仅在需要时才有效评估序列的方法。

def records(stream):
    while stream:
        lines = []
        for line in stream:
            lines.append(line)
            if line.startswith('//'):
                break
        record = ''.join(lines)
        yield record

for record in records(data):
    if "5'UTR\nNO information" not in record:
        output.write(record)

【讨论】:

    【解决方案2】:

    以下脚本将创建一个新的output.txt 文件,其中仅包含没有NO information 行的块:

    with open('file.txt', 'r') as f_input, open('output.txt', 'w') as f_output:
        text = f_input.read()
        blocks = re.findall(r"^(Start.*?^\/\/\n*)", text, re.M+re.S)
        blocks = [block for block in blocks if re.search(r"5'UTR\n(?!NO information).*?\n", block, re.M+re.S)]
        f_output.write("".join(blocks))
    

    对于您的示例,output.txt 将与输入相同。它首先创建所有块的列表。然后它会过滤掉任何具有NO information 的块,然后将所有剩余块写入一个新文件。

    【讨论】:

    • 将整个文件读入 RAM 以进行处理速度很快(尽管对于简单任务,正则表达式往往比等效的 str 方法慢)。但是,如果 Advait 有 大量 生物数据要处理,则一次读取所有数据可能不切实际。
    猜你喜欢
    • 2021-05-19
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    相关资源
    最近更新 更多