поиск конкретных повторов с помощью Python - PullRequest
1 голос
/ 27 марта 2019

пример входного файла:

1  AAcgGGGGGGtacctgt    yes
2  TTcccccctgtAAcgta   no
3  tcgAAAAaatacgacc     no
4  AAcgtataatacctgt   no
...

Я хочу написать программу для сканирования каждой последовательности и проверки наличия мономерных нуклеотидных повторов (mnr)

пример вывода:

1,AAcgGGGGGGtacctgt,yes
2,TTcccccctgtAAcgta,no

Определение: мономерные нуклеотиды: повторы A, T, C, G (не чувствительны к регистру)

Я ищу подряд что-то вроде этого: AAAAaaAAgtc или же gtAAAAAAAAAAc или же aaaaaaAAA или же aaaaaaaaaa или же ccccccccccc или же CCCCCcccCCC или ...

Я пытался это регулярные выражения, но не работает:

import csv
import re
list=[]
with open('sequences.txt', 'r') as f:
    reader = csv.reader(f,delimiter="\t")
    seq=re.findall(r'[Aa]{6, }','sequences.txt')
    for line in reader:
        if line.__contains__(seq):
            print(list.append(line))

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Вот вам компактное решение того, что вы хотите:

import csv
with open('sequences.txt', 'r') as f:
    reader = csv.reader(f, delimiter=",")
    for line in reader:
        seq_lower = line[1].lower()
        if 'aaaaaa' in seq_lower or 'cccccc' in seq_lower or 'tttttt' in seq_lower or 'gggggg' in seq_lower:
            print(line)

Здесь я предположил, что вы рассматриваете только множители a,c,g,t, поскольку вы работаете с последовательностью ДНК.

0 голосов
/ 27 марта 2019

Обновление: с тех пор было предложено частичное решение с использованием регулярных выражений.Обратите внимание, что следующее решение не работает с использованием регулярных выражений и вместо этого ищет любую последовательность любого символа длиной шесть или более.

Тестовые данные:

number,sequence,status
1,kjhfklashfkldflkhasdfl,0
2,aaaaaljgkldfkjgldkfjgfldj,0
3,bbbbbbjigdfsjgjg,0
4,ccCccCCcjjfijsdfjsdf,0
5,klsjdflsjdfhdddddjnjlkhngjk,0
6,kjkljfhnlasjkdfheeeeeeejjjeeeeeeeeeekjdkljfleeef,0
7,jhfshffFffFFFFffkljjjj908u89,0

Код для поиска MNR длины 6или больше:

import csv

def contains_mnr(sequence):
    start_char = "$" # choose a character that is sure not to be in the sequence
    count = 0
    seq_lower = sequence.lower()

    for pos in range(0, len(seq_lower)):
        if seq_lower[pos] == start_char:
            count += 1
        else:
            start_char = seq_lower[pos]
            count = 1
        if count >= 6:
            return True

    return False

with open("input.csv", "r") as input_file:
    with open("output.csv", "w") as output_file:
        reader = csv.DictReader(input_file, dialect=csv.unix_dialect())
        writer = csv.writer(output_file, dialect=csv.unix_dialect())
        writer.writerow(reader.fieldnames)

        for row in reader:
            if contains_mnr(row["sequence"]):
                writer.writerow([
                    row["number"],
                    row["sequence"],
                    row["status"]
                ])

Обратите внимание, что диалект CSV, возможно, должен быть адаптирован к системе, в которой выполняется код, и файлы данных генерируются.

Вывести указанные тестовые данные выше:

"number","sequence","status"
"3","bbbbbbjigdfsjgjg","0"
"4","ccCccCCcjjfijsdfjsdf","0"
"6","kjkljfhnlasjkdfheeeeeeejjjeeeeeeeeeekjdkljfleeef","0"
"7","jhfshffFffFFFFffkljjjj908u89","0"
...