我正在编写一个程序,它应该返回最小序列比对分数(更小 = 更好),并且它适用于 Coursera 样本输入,但对于我们给出的数据集,我无法手动输入序列,所以我不得不求助于使用文本文件。有几件事我觉得很奇怪。 要事第一,
pattern = 'AAA'
DNA = open('practice_data.txt')
empty = []
for lines in DNA:
line=lines.strip().strip('\n')
empty.append(line)
print(empty)
print(smallest_distance(pattern, DNA))
如果我运行它,我的程序输出 0。如果我注释掉 for 循环,我的程序输出 2。我没有改变 DNA,那么为什么我的程序会有不同的行为?另外,我的 strip('\n') 正在工作(并且出于某种原因, strip('n') 工作得很好)但我的 strip() 不工作。一旦我弄清楚了这一点,我就可以在我的 smallest_distance 函数中测试空值。
这是我的数据:
ACTAG
CTTAGTATCACTCTGAAAAGAGATTCCGTATCGATGACCGCCAGTTAATACGTGCGAGAAGTGGACACGGCCGCCGACGGCTTCTACACGCTATTACGATG AACCAACAATTGCTCGAATCCTTCCTCAAAATCGCACACGTCTCTCTGGTCGTAGCACGGATCGGCGACCCACGCGTGACAGCCATCACCTATGATTGCCG
TTAAGGTACTGCTTCATTGATCAACACCCCTCAGCCGGCAATCACTCTGGGTGCGGGCTGGGTTTACAGGGGTATACGGAAACCGCTGCTTGCCCAATAAT
etc...
最佳答案
解决方案:
pattern = 'AAA'
with open('practice_data.txt') as f_dna:
dna_list = [sequence for line in f_dna for sequence in line.split()]
print(smallest_distance(pattern, dna_list))
解释:
您已接近解决方案,但您需要重新放置 strip()
通过 split()
-> strip()
删除多余的字符,所以你的 strip('\n')
是一个很好的猜测。
但是因为 \n
在行尾,split 会自动去掉它,因为它被算作分隔符
例如
>>> 'test\ntest'.split()
>>> ['test', 'test']
>>> 'test\n'.split()
>>> ['test']
现在您必须通过列表操作之间的简单加法来重新放置 .append()
,因为拆分会返回一个 list
。
DNA = open('practice_data.txt')
empty = []
for lines in DNA:
line = lines.split()
empty += line
但是,您的代码中仍然存在一些问题:
最好使用 with
打开文件时的语句,因为它会自动处理异常并在最后关闭文件描述符:
empty = []
with open('practice_data.txt') as DNA:
for lines in DNA:
line = lines.split()
empty += line
你的代码现在没问题了,你仍然可以使用列表理解(在 python 中很常见)进行重构
with open('practice_data.txt') as DNA:
empty = [sequence for line in DNA for sequence in line.split()]
如果您难以理解这一点;尝试用 for 循环重组它
empty = []
with open('practice_data.txt') as DNA:
for line in DNA:
for sequence in line.split():
empty.append(sequence)
注意:@MrGeek 解决方案有效,但作为两个主要默认值:
- 因为它没有使用
with
语句,文件永远不会关闭,导致内存问题, - 使用
.read().splitlines()
会将文件的所有内容加载到内存中,如果文件太大,这可能会导致MemoryError
异常。
更进一步,处理大文件:
现在假设您有一个充满 DNA 序列的 1GO 文件,即使您没有将所有文件加载到内存中,您仍然有一个巨大的 dict
,更好的做法是创建结果的另一个文件并即时处理您的 DNA:
例如
pattern = 'AAA'
with open('practice_data.txt') as f_dna, open('result.txt', 'w') as f_result:
for line in DNA:
for sequence in line.split():
result = smallest_distance(pattern, sequence)
f_result.write(result)
警告:您必须确保函数smallest_distance
接受string
而不是list
。
如果不行的话,你可能需要改为批处理,但是因为它有点复杂我就不在这里说了。
现在您可以使用例如生成器函数进行一些重构以提高可读性
def extract_sequence(file, pattern):
for line in file:
for sequence in line.split():
yield smallest_distance(pattern, sequence)
pattern = 'AAA'
with open('practice_data.txt') as f_dna, open('result.txt', 'w') as f_result:
for result in extract_sequence(f_dna, pattern):
f_result.write(result)
关于python - 不更改文本文件 Python 的奇怪值更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45651919/