如果满足一定条件,如何连接文件的连续两行?

时间:2019-06-06 04:06:23

标签: python

**是Python的新功能,对不起**

我正在尝试获取给定的示例文件,并使用函数仅将包含“ A”或“ T”或“ G”或“ C”(DNA链)的行添加到列表中。

示例文件:

gene1
ATGATGATGGCG
基因2
GGCATATC
CGGATACC
基因3
TAGCTAGCCCGC

在gene2下,需要使用我的函数来连接两行。

这是我完成的功能:

def create(filename):
    """
    Purpose: Creates and returns a data structure (list) to store data.
    :param filename: The given file
    Post-conditions: (none)
    :return: List of data.
    """
    new_list = []
    f = open(filename, 'r')
    for i in f:
        if not('A' or 'T' or 'G' or 'C') in i:
            new_list = new_list  #Added this so nothing happens but loop cont.
        else:
            new_list.append(i.strip())
    f.close()
    return new_list

我需要以某种方式找到文件中包含两行连续DNA(“ GTCA”)的部分,然后将它们加入到列表中。

如果操作正确,则打印时的输出应为:

['ATGATGATGGCG', 'GGCATATCCGGATACC', 'TAGCTAGCCCGC']

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用set来检查某行是否为DNA线,即仅由ACGT字母组成:

with open(filename) as f:
    new_list = []
    concat = False
    for line in f:
        if set(line.strip()) == {'A', 'C', 'G', 'T'}:
            if concat:
                new_list[-1] += line.strip()
            else:
                new_list.append(line.strip())
            concat = True
        else:
            concat = False

# ['ATGATGATGGCG', 'GGCATATCCGGATACC', 'TAGCTAGCCCGC']

答案 1 :(得分:1)

抢险救援!

<div *ngFor="let item of category">
   <div *ngFor="let subItem of item.categories">
       {{subItem.categories.id}}
   </div>
</div>

需要特别注意的是,如果import re def create(filename): dna_regex = re.compile(r'[ATGC]+') with open(filename, 'r') as f: return dna_regex.findall(f.read().replace('\n', ''))) new_list = [] new_list += create("gene_file.txt") 行包含A,T,G或C,则此实现尤其可能会产生误报。

它的作用是将整个文件放入,删除换行符,然后查找仅包含A,T,G或C的所有序列,并返回它们。

答案 2 :(得分:0)

如果我们可以假设每个DNA部分都以一行作为前缀,则可以利用takewhile函数来对DNA行进行分组:

from itertools import takewhile

DNA_CHARS = ('A', 'T', 'G', 'C')
lines = ['gene1', 'ATGATGATGGCG', 'gene2', 'GGCATATC', 'CGGATACC', 'gene3', 'TAGCTAGCCCGC']

input_lines = iter(lines[1:])
dna_lines = []

while True:
    dna_line = ''.join(takewhile(lambda l: any(dna_char in l for dna_char in DNA_CHARS),
                                  input_lines))
    if not dna_line:
        break
    dna_lines.append(dna_line)