#!/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)
答案 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
。同样,使用相等性测试空字符串会遗漏一些重要的边缘情况(例如,line
是None
是什么?);请改用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)