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

标签 python file loops text iteration

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

相关文章:

bash - 如何计算 Bash 中所有人类可读的文件?

java - 循环TextView并设置大小

loops - Tasm - assembly 循环

python - 系列图 - 将 y 轴设置为系列值

php - MySQLdump 结果有很多注释行,没有真正的内容

python - 是否可以将按钮添加到 Wagtail 设置页面?

c++ - 为什么这段代码总是返回零文件大小?

python - 递归比迭代更糟糕吗?

python - 如何在 tensorflow 中使用相同的权重进行初始化?

python - 使用 Django Haystack 添加 ElasticSearch 同义词