【问题标题】:search for specific repeats using python使用 python 搜索特定的重复
【发布时间】:2019-03-27 06:13:04
【问题描述】:

输入文件示例:

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))

任何帮助表示赞赏。

【问题讨论】:

  • mnr 是更大字符串的一部分吗?
  • 还要说明你想要8个以上还是6个以上!
  • 对不起。是的,它是较大字符串(序列)的一部分,我想要超过 6 个!非常感谢:)
  • 这个网站是关于编程问题的,而不是让别人为你写代码。请提供您已经尝试过但未按您预期/希望的方式工作的代码。
  • 感谢您的回复,我想到了正则表达式并写了这个..但是我知道它不正确:

标签: python regex bioinformatics dna-sequence


【解决方案1】:

这里是您想要的紧凑型解决方案:

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)

在这里,我假设您在处理 DNA 序列时只考虑了 a,c,g,t 的 mnrs。

【讨论】:

  • 哇,效果很好!只是一件小事是我需要将 line[1].lower() 更改为 0。但是根据这个数字不断变化的逻辑,我并没有安静下来?仅仅因为它在for循环中?
  • 我假设你要处理的序列在第二列,所以我设置了 line[1].lower()。是的,使用 for 循环,行将更改为文件的新行(或者更简洁地更改为包含文件新行的分隔字符串的列表)。现在您可以接受答案并投票是否可行:D
【解决方案2】:

更新:已经提出了使用正则表达式的部分解决方案。请注意,以下解决方案不适用于正则表达式,而是查找长度为 6 或更长的任何字符的任何序列。

测试数据:

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

查找长度为 6 或更大的 MNR 的代码:

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"

【讨论】:

  • 酷!看起来如果你去掉引号,你就会得到有问题的输出!
  • @Etienne Ott 嗨,Etienne,非常感谢您的解决方案,首先您看到我的解决方案了吗?使用正则表达式怎么样?对于您的解决方案,我不理解“其他”部分:(在我的情况下,start_char 应该是 A、C、G 或 T(每次我必须把它们都放在正确的位置?)以及我应该把我的序列放在哪里文件?抱歉,我想问的问题很简单:(
  • @Oka 你能澄清一下到底是哪个报价单吗?
  • @Nazanin Shambayati 在答案中显示的输出中引用。
  • 是的,我看到了问题的更新,但我认为此任务不需要使用正则表达式。变量start_char 不能是预期出现在序列中的任何字符。该方法假定它已经读取了该字符的一个实例,并且如果它是 A、C、G、T 中的任何一个,那么它将错误地计算前五个字符。指定的两个文件我称为input.csvoutput.csv,但是您当然可以随意调用它们。输出文件中的引号在那里,因为这是 CSV 方言指定的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多