gpt4 book ai didi

python - 不更改文本文件 Python 的奇怪值更改

转载 作者:行者123 更新时间:2023-11-28 17:13:38 24 4
gpt4 key购买 nike

我正在编写一个程序,它应该返回最小序列比对分数(更小 = 更好),并且它适用于 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com