如何删除txt文件中以相同字母(序列)开头的行?

时间:2018-11-20 18:08:19

标签: python

#!/usr/bin/env python

FILE_NAME = "testprecomb.txt"                       
NR_MATCHING_CHARS = 5                        

lines = set()                                 
with open(FILE_NAME, "r") as inF:            
    for line in inF:                         
        line = line.strip()                 
        if line == "": continue              
        beginOfSequence = line[:NR_MATCHING_CHARS]
        if not (beginOfSequence in lines):  
            print(line)                      
            lines.add(beginOfSequence)        

这是我现在拥有的代码,但无法正常工作。我有一个文件,其中的DNA行有时以相同的序列(或字母模式)开头。我需要编写代码来查找所有以相同字母(也许是10个字符)开头的DNA行,并删除其中的一行。

示例(问题):

CCTGGATGGCTTATATAAGAT***GTTAT***

***GTTAT***ATAATATACCACCGGGCTGCTT

***GTTAT***ATAGTTACAGCGGAGTCTTGTGACTGGCTCGAGTCAAAAT

从文件中取出一个文件后,我需要什么:

CCTGGATGGCTTATATAAGAT***GTTAT***

***GTTAT***ATAATATACCACCGGGCTGCTT
(no third line)

2 个答案:

答案 0 :(得分:0)

我认为您设定的逻辑是正确的。您只缺少将要写回的行保存到文件中的部分。我猜您尝试过使用一个单独的列表尝试此操作,但由于在某个地方使用了附加操作,因此您忘记在此处添加列表。

FILE_NAME = "sample_file.txt"
NR_MATCHING_CHARS = 5

lines = set()
output_lines = [] # keep track of lines you want to keep
with open(FILE_NAME, "r") as inF:
    for line in inF:
        line = line.strip()
        if line == "": continue
        beginOfSequence = line[:NR_MATCHING_CHARS]
        if not (beginOfSequence in lines):
            output_lines.append(line + '\n') # add line to list, newline needed since we will write to file
            lines.add(beginOfSequence)
print output_lines

with open(FILE_NAME, 'w') as f:
    f.writelines(output_lines) # write it out to the file

答案 1 :(得分:0)

您的方法存在一些问题。首先,我将避免命名文件变量inF,因为这可能与inf混淆。描述性名称更好:例如testFile。同样,使用相等性测试空字符串会遗漏一些重要的边缘情况(例如,lineNone是什么?);请改用not关键字。至于您的实际问题,您实际上并没有根据设置的成员资格做任何事情:

FILE_NAME = "testprecomb.txt"                       
NR_MATCHING_CHARS = 5                        

prefixCache = set()
data = []
with open(FILE_NAME, "r") as testFile:            
    for line in testFile:                         
        line = line.strip()                 
        if not line: 
            continue              
        beginOfSequence = line[:NR_MATCHING_CHARS]
        if (beginOfSequence in prefixCache):
            continue
        else:
            print(line)
            data.append(line)
            prefixCache.add(beginOfSequence)