如何仅读取字符串或子字符串的特定部分

2024-10-01 22:39:40 发布

您现在位置:Python中文网/ 问答频道 /正文

该项目的目标是从文本文件中打开并读取DNA序列,例如,如果子字符串是AGATC,那么连续子字符串也是,我们添加到计数器中,一旦连续子字符串不再是AGATC,目标是将其计数到范围内的最高分数,清除计数器并继续搜索,以查找最长的连续序列

        str_count = []
        counter = 0
        highest = 0
        # read sequence
    
        with open(argv[2], "r") as seq:
            seqRead = seq.read()
            for i in range(len(seqRead)):
                #search for consecutive AGATC
                if i == 'A' and seqRead[i:i+6] == 'AGATC':
                    while i == 'A' and seqRead[i:i+6] == 'AGATC':
                        counter += 1
                        i = i + 5
                if highest < counter:
                    highest = counter
                    counter = 0
                else:
                    counter = 0

现在的问题是,我认为我没有正确地比较文本序列,因此没有读取字符串中正确的字母序列

我的目标是将“i”作为“a”进行跟踪,然后提取连续的4个字母,并将其与“AGATC”进行比较,如果匹配,则增加计数器,并将“i”更改为比较后的字母,如果是重复的,直到不再连续,然后将其添加到最高位,直到结束。 这至少是im,但是当运行调试器时,我注意到它从未进入第一个if语句,这使我相信我正在比较的方式是不正确的

样本输入:

AGATCAGATCAGATCAGATCAGATCDJFDHFDTTTTCCSSDDSDDGFJFHAGATCAGATCAGATCAGATCAGATCAGATGJFHJGHJDSHGDKFSAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCDKFDKDFKGJKDFKAGATCkFGJKFDDAGATCDFKJKFJFKDJKAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCAGATCKFDHDFKFDHKGHKDFGJFKHDFK

预期产量:最高=30

由于AGATC的最长连续出场时间为30次

输入:

AAGGTAAGTTTAGAATATAAAAGGTGAGTTAAATAGAATAGGTTAAAATTAAAGGAGATCAGATCAGATCAGATCTATCTATCTATCTATCTATCAGAAAAGAGTAAATAGTTAAAGAGTAAGATATTGAATTAATGGAAAATATTGTTGGGGAAAGGAGGGATAGAAGG

输出:最高=4

我是否弄错了如何使用seqRead[i:i+6]

我怎样才能做得更好呢


Tags: and字符串目的目标forreadif字母
2条回答

子字符串太长,seqRead[i:i+6]将给出长度为6个字符的字符串,而不是5个字符的字符串。该行(以及进行类似比较的另一行)应改为seqRead[i:i+5]。另外,您试图将迭代器(i)与字母进行比较,而我认为您的意思是比较seqRead中迭代器位置处的字母i == 'A'应更改为seqRead[i] == 'A'

    str_count = []
    counter = 0
    highest = 0
    # read sequence

    with open(argv[2], "r") as seq:
        seqRead = seq.read()
        for i in range(len(seqRead)):
            #search for consecutive AGATC
            if seqRead[i] == 'A' and seqRead[i:i+5] == 'AGATC':
                while seqRead[i] == 'A' and seqRead[i:i+5] == 'AGATC':
                    counter += 1
                    i = i + 5
            if highest < counter:
                highest = counter
                counter = 0
            else:
                counter = 0

在代码中if之前的while循环是多余的。您正在切片不正确的子字符串,下面是更新和简化的代码:

for i in range(len(seqRead)):
    while seqRead[i:i+5] == "AGATC":
        counter += 1
        i += 5
    if counter > highest:
        highest = counter
    counter = 0

相关问题 更多 >

    热门问题