如何在不使用range()python的情况下删除文本文档的特定部分

2024-05-23 23:01:50 发布

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

基本上,我得到一个文本文档,其中包含一个标题(大约8行),然后是一堆DNA序列。我可以想出所有的解决方案,我需要解决我的特殊问题,除了如何提取DNA序列从标题。我可以用

dna = open("dna_sequence.txt").read().split('\n')

他们成功地把每一行都写进了一个列表。这正是我想要的。但是,列表中的前8项基本上是垃圾,我需要将它们从列表的其余部分中删除,而不必使用like.pop()或slice或从某个范围创建列表。你知道吗

我们唯一可以用来完成这个任务的模块是熊猫,但是我们还没有过多的讨论,我对它不太熟悉。我知道没有那个模块是可以做到的。你知道吗

好的,所以从这里的评论是更多的信息,对不起,我没有包括它,不知道这将是重要的:D

LOCUS: SCU49845
ACCESSION: U49845
ORGANISM: Saccharomyces cerevisiae (baker's yeast)          
AUTHORS: Roemer,T., Madden,K., Chang,J. and Snyder,M.
TITLE: Selection of axial growth sites in yeast requires Axl2p, a novel plasma membrane glycoprotein
JOURNAL: Genes Dev. 10 (7), 777-793 (1996)
PUBMED: 8846915
SOURCE: https://www.ncbi.nlm.nih.gov/nuccore/U49845.1?report=genbank&to=5028
GATCCTCCATATACAACGGTATCTCCACCTCAGGTTTAGATCTCAACAACGGAACCATTGCCGACATGAG
ACAGTTAGGTATCGTCGAGAGTTACAAGCTAAAACGAGCAGTAGTCAGCTCTGCATCTGAAGCCGCTGAA
GTTCTACTAAGGGTGGATAACATCATCCGTGCAAGACCAAGAACCGCCAATAGACAACATATGTAACATA
TTTAGGATATACCTCGAAAATAATAAACCGCCACACTGTCATTATTATAATTAGAAACAGAACGCAAAAA

因此,我将要使用的.txt文档如下所示。一堆代码。我需要删除DNA序列上面的部分,所以我只剩下一个DNA序列的列表,不管字符串有多长,因为我将在下一部分的赋值中使用for循环。你知道吗

任务是提取DNA序列并创建一个包含补码的字符串。我可以很容易地用for循环来实现,因为只有4个核苷酸,每个只有1个补体。你知道吗

他明确地说我们可以用熊猫来做,但是由于我们还没有过多的讨论,他不希望我们知道如何做,我们可以用Python来做。你知道吗

如果我能做的话dna切片(1,9)那很简单,但他说我们不能那样做。所以我迷路了


Tags: 模块字符串txt标题列表forread序列
3条回答

好的,澄清一下,并展示我得到的答案,以防万一其他人也有同样的问题。你知道吗

我被允许使用re,我和我的教授商量过了。你知道吗

但任务是“定义一个函数,这样,如果从文本文件(*.txt)输入,就可以找到所有的DNA序列并提供补码”

多亏了你们,还有一些年轻人,这就是我想到的: (我100%肯定它可能会被清理,但它要到星期一才到期)

import re
def dnaMatching(t):
    with open(t) as n:
        dna = [line for line in m if re.match(r'^[AGCT]+$', line)]
    complement = ""
    for i in dna:
        for x in i:
            if x == 'A':
                complement += 'T'
            elif x == 'G':
                complement += 'C'
            elif x == 'C':
                complement += 'G'
            elif x == 'T':
                complement += 'A'
    return complement

非常感谢你们的帮助!你知道吗

如果您只是想获取dna序列,可以使用正则表达式遍历文件:

import re

with open(somefile) as fh:
     mydna = [line for line in fh if re.match('^[AGCT]+$', line)]

mydna
# ['GATCCTCCATATACAACGGTATCTCCACCTCAGGTTTAGATCTCAACAACGGAACCATTGCCGACATGAG',
# 'ACAGTTAGGTATCGTCGAGAGTTACAAGCTAAAACGAGCAGTAGTCAGCTCTGCATCTGAAGCCGCTGAA',
# 'GTTCTACTAAGGGTGGATAACATCATCCGTGCAAGACCAAGAACCGCCAATAGACAACATATGTAACATA',
# 'TTTAGGATATACCTCGAAAATAATAAACCGCCACACTGTCATTATTATAATTAGAAACAGAACGCAAAAA']

这样您就不会忽略任意数量的行,尽管这不是一个具体的答案。你知道吗

要构建补码dna字符串,可以使用字典将碱基映射到它们的补码,并对每个字符串进行迭代,如下所示:

mapping = {'A': 'T', 'T': 'A', 'C': 'G', 'G':'C'}

# .get(base, ' ') will either return the value or an empty string
# mapping.get('A', ' ') will return 'T' whereas mapping.get('U', ' ') will 
# return ' '
complements = [''.join(mapping.get(base, ' ') for base in dna) for dna in mydna]

熊猫回答:

import pandas as pd

df = pd.read_csv(sep="\n", header=None, names = ['code'])

regex = "[^ATCG]+\\b"     # Regex that gets eveything that's not a DNA code.
filter = df['code'].str.contains(regex)
df = df[~filter]          # Keep only the DNA codes.

相关问题 更多 >