为何DNA序列STR最长匹配函数仅执行一次?
问题根源:文件读取指针的位置问题
你遇到的核心问题是文件对象的read()方法只能读取一次完整内容:
- 第一次调用
DNA_sequence.read()时,会把整个文件内容读到内存,同时文件内部的指针会移动到文件末尾。 - 后续循环里再调用
DNA_sequence.read(),指针已经在末尾,只能返回空字符串""。 - 你的
longest_match函数拿到空序列后,计算出的最长匹配自然是0,所以后续执行都无效。
修复方案
1. 提前读取DNA序列到变量
把文件内容一次性读取到变量中,循环里直接使用这个变量,而不是反复调用read():
def main(): # Check for command-line usage if len(sys.argv) != 3: exit() # 用with语句管理数据库文件(自动关闭) with open(sys.argv[1], "r") as database: # 后续可在这里处理数据库内容,比如用csv.reader解析 pass # 提前读取完整DNA序列到变量 with open(sys.argv[2], "r") as dna_file: dna_sequence = dna_file.read().strip() # strip()去除首尾换行/空白符 # Makes a dictionary of kinds of sequences sub_sequences = {0: ["AGATC", 0], 1: ["TTTTTTCT", 0], 2: ["AATG", 0], 3: ["TCTAG", 0], 4: ["GATA", 0], 5: ["TATC", 0], 6: ["GAAA", 0], 7: ["TCTG", 0]} # Finds the longest match of each STR in DNA sequence sub_sequences_length = len(sub_sequences) for i in range(sub_sequences_length): # 使用提前读取好的dna_sequence变量 sub_sequences[i][1] = longest_match(dna_sequence, sub_sequences[i][0]) return
2. 额外优化建议
- 把
sub_sequences改成更直观的键值对结构,避免用数字索引,代码可读性更强:sub_sequences = {"AGATC": 0, "TTTTTTCT": 0, "AATG": 0, "TCTAG": 0, "GATA": 0, "TATC": 0, "GAAA": 0, "TCTG": 0} # 循环时直接遍历键值对 for seq, _ in sub_sequences.items(): sub_sequences[seq] = longest_match(dna_sequence, seq) - 始终用
with语句操作文件,它会自动处理文件关闭,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Valdemarcheck
相关产品推荐
相关产品推荐

