Python 如何将字符串拆分为大小相等的部分?

Python 如何将字符串拆分为大小相等的部分?,python,string,bioinformatics,Python,String,Bioinformatics,我有一个包含核苷酸序列的字符串。字符串长度为1191个核苷酸 如何以每行只有100个核苷酸的格式打印序列?现在我有它的硬编码,但我希望它适用于任何一串核苷酸。这是我现在的代码 def printinfasta(SeqName, Sequence, SeqDescription): print(SeqName + " " + SeqDescription) #how do I make sure to only have 100 nucleotides per

我有一个包含核苷酸序列的字符串。字符串长度为1191个核苷酸

如何以每行只有100个核苷酸的格式打印序列?现在我有它的硬编码,但我希望它适用于任何一串核苷酸。这是我现在的代码

def printinfasta(SeqName, Sequence, SeqDescription):
    print(SeqName + " " + SeqDescription)
    #how do I make sure to only have 100 nucleotides per line?
    print(Sequence[0:100])
    print(Sequence[100:200])
    print(Sequence[200:300])
    print(Sequence[400:500])
    print(Sequence[500:600])
    print(Sequence[600:700])
    print(Sequence[700:800])
    print(Sequence[800:900])
    print(Sequence[900:1000])
    print(Sequence[1000:1100])
    print(Sequence[1100:1191])
printinfasta(SeqName, Sequence, SeqDescription)
序列="nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn ccctaaccctaaccctaaccctaacctaaacctaccataccataccataccataccataccataccataccataccataccataccataccataccataccataccataccataccataccataccataccataccataccataccataccatactataccataccataccataccataccataccataccataccataccataccataccataccataccataccatactataccataccataccataccatactataccataccataccataccataccataccataccatactataccataccataccatactataccataccataccataccataccataccataccataccataccataccataccataccataccataccataccTTGTAGATGGTCTTCTCTCTCTCTCTCTCTCTCTCTCTCTCTGTGTGTTTGTGTTTAGTTAGCTGTGTGTTTGGTCGTGTGTGACTCATAGTTGGTTGTGTTCTCTCTTTTTTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT

您可以使用
textwrap.wrap
将长字符串拆分为字符串列表

import textwrap

seq = "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCCCTAAACCCTAAACCCTAAACCCTAAACCCTAAACCCTAAACCCTAAACCCTAAATCCATAAATCCCTAAAACCATAATCCTAAATCCCTTAATTCCTAAATCCCTAATACTTAGACCCTAATCTTTAGTTCCTAGACCCTAATCTTTAGTTCCTAGACCCTAAATCCATAATCCTTAATTCCTAAATTCCTAAATCCCTAATACTAAATCTCTAAATCCCTAGCAATTTTCAAGTTTTGCTTGATTGTTGTAGGATGGTCCTTTCTCTTGTTTCTTCTCTGTGTTGTTGAGATTAGTTTGTTTAGGTTTGATAGCGTTGATTTTGGCCTGCGTTTGGTGACTCATATGGTTTGATTGGAGTTTGTTTCTGGGTTTTATGGTTTTGGTTGAAGCGACATTTTTTTGTGGAATATGGTTTTTGCAAAATATTTTGTTCCGGATGAGTAATATCTACGGTGCTGCTGTGAGAATTATGCTATTGTTTT"
print('\n'.join(textwrap.wrap(seq, width=100)))

您可以使用
itertools.zip\u longest
和一些
iter
magic在一行中实现这一点:

from itertools import zip_longest

sequence = "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCCCTAAACCCTAAACCCTAAACCCTAAACCCTAAACCCTAAACCCTAAACCCTAAATCCATAAATCCCTAAAACCATAATCCTAAATCCCTTAATTCCTAAATCCCTAATACTTAGACCCTAATCTTTAGTTCCTAGACCCTAATCTTTAGTTCCTAGACCCTAAATCCATAATCCTTAATTCCTAAATTCCTAAATCCCTAATACTAAATCTCTAAATCCCTAGCAATTTTCAAGTTTTGCTTGATTGTTGTAGGATGGTCCTTTCTCTTGTTTCTTCTCTGTGTTGTTGAGATTAGTTTGTTTAGGTTTGATAGCGTTGATTTTGGCCTGCGTTTGGTGACTCATATGGTTTGATTGGAGTTTGTTTCTGGGTTTTATGGTTTTGGTTGAAGCGACATTTTTTTGTGGAATATGGTTTTTGCAAAATATTTTGTTCCGGATGAGTAATATCTACGGTGCTGCTGTGAGAATTATGCTATTGTTTT" 

output = [''.join(filter(None, s)) for s in zip_longest(*([iter(sequence)]*100))]
或:


一种可能的解决方案是使用
re
模块

import re

def splitstring(strg, leng):
    chunks = re.findall('.{1,%d}' % leng, strg)
    for i in chunks:
        print(i)


splitstring(strg = seq, leng = 100))

我假设您的序列是FASTA格式。如果是这种情况,您可以使用提供FASTA序列包装实用程序的许多生物信息学软件包中的任何一个。例如,您可以使用。使用命令行实用程序包装FASTA序列,例如,每行最多100个核苷酸:

fasta_formatter -i INFILE -o OUTFILE -w 100
您可以使用
conda
安装
fastxtoolkit
软件包,例如:
conda安装fastx\u工具包


conda create-n fastx\u工具包fastx\u工具包

请注意,如果您最终编写(简单)代码从头开始包装FASTA序列,请记住不应包装标题行(以
开头的行)。仅包装序列行

另请参见:


您可以使用基于的辅助函数。辅助函数的设计目的是(也)处理序列不是相等部分大小的精确倍数的情况(最后一组的元素将少于之前的元素)

样本输出:

Name Description
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
CCCTAAACCCTAAACCCTAAACCCTAAACCCTAAACCCTAAACCCTAAACCCTAAATCCATAAATCCCTAAAACCATAATCCTAAATCCCTTAATTCCTA
AATCCCTAATACTTAGACCCTAATCTTTAGTTCCTAGACCCTAATCTTTAGTTCCTAGACCCTAAATCCATAATCCTTAATTCCTAAATTCCTAAATCCC
TAATACTAAATCTCTAAATCCCTAGCAATTTTCAAGTTTTGCTTGATTGTTGTAGGATGGTCCTTTCTCTTGTTTCTTCTCTGTGTTGTTGAGATTAGTT
TGTTTAGGTTTGATAGCGTTGATTTTGGCCTGCGTTTGGTGACTCATATGGTTTGATTGGAGTTTGTTTCTGGGTTTTATGGTTTTGGTTGAAGCGACAT
TTTTTTGTGGAATATGGTTTTTGCAAAATATTTTGTTCCGGATGAGTAATATCTACGGTGCTGCTGTGAGAATTATGCTATTGTTTT

软件包
cytoolz
(可使用
pip安装cytoolz
安装)提供一个可在此处使用的功能:

#!/usr/bin/env python3
from cytoolz import partition_all

def printinfasta(name, seq, descr):
    header = f">{name} {descr}"
    print(header)
    print(*map("".join, partition_all(100, seq)), sep="\n")


printinfasta("test", 468 * "ACGTGA", "this is a test")
partition_all(100,seq))
生成100个字母的元组,每个元组取自
seq
,最后一个较短的元组是字母数不是100的倍数

映射(“.join,…)
用于将每个元组中的字母分组为单个字符串


*
地图前面的
*
将其结果视为
打印

的独立参数。这里有一个有趣的答案供您参考:彻底回答问题非常耗时。如果您的问题得到解决,请通过接受最适合您需要的解决方案来表示感谢。接受检查位于up/do下方答案左上角的wn箭头。如果出现更好的解决方案,则可以接受新的解决方案。如果您的声誉超过15%,您还可以使用向上或向下箭头对答案的质量/帮助性进行投票。如果解决方案不能回答问题,请留下评论。谢谢。这是否回答了您的问题?
Name Description
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
CCCTAAACCCTAAACCCTAAACCCTAAACCCTAAACCCTAAACCCTAAACCCTAAATCCATAAATCCCTAAAACCATAATCCTAAATCCCTTAATTCCTA
AATCCCTAATACTTAGACCCTAATCTTTAGTTCCTAGACCCTAATCTTTAGTTCCTAGACCCTAAATCCATAATCCTTAATTCCTAAATTCCTAAATCCC
TAATACTAAATCTCTAAATCCCTAGCAATTTTCAAGTTTTGCTTGATTGTTGTAGGATGGTCCTTTCTCTTGTTTCTTCTCTGTGTTGTTGAGATTAGTT
TGTTTAGGTTTGATAGCGTTGATTTTGGCCTGCGTTTGGTGACTCATATGGTTTGATTGGAGTTTGTTTCTGGGTTTTATGGTTTTGGTTGAAGCGACAT
TTTTTTGTGGAATATGGTTTTTGCAAAATATTTTGTTCCGGATGAGTAATATCTACGGTGCTGCTGTGAGAATTATGCTATTGTTTT
#!/usr/bin/env python3
from cytoolz import partition_all

def printinfasta(name, seq, descr):
    header = f">{name} {descr}"
    print(header)
    print(*map("".join, partition_all(100, seq)), sep="\n")


printinfasta("test", 468 * "ACGTGA", "this is a test")