用Python将文本转换为DNA序列
脱氧核糖核酸(DNA
)是一种有前途的存储介质,能够存储和存档我们大量的数据。
当比特被转换为碱基时,数据可以在DNA中进行编码。
编码数据就是将其从一种形式转换为另一种形式。编码的图像、录音、视频和字符可以用来编译和执行程序,传输、存储和压缩/解压数据,以及转换文件。我决定将输入的文本编码为DNA
序列,希望能将其储存起来。
以下是我是如何做到的。
关于该项目
在文本被映射到核苷酸序列之前,它必须被转换为二进制序列。在计算科学中,二进制序列用比特和字节表示对计算机的指令和数据类型。二进制数字,或比特,存储0或1,使它们成为最小的存储单位。8位组合在一起构成一个字节,如01011010和01000001。
核苷酸是一种由戊糖(5个碳原子)、一个磷酸基团和一个含氮碱基组成的化合物。在DNA中,4个含氮碱基是腺嘌呤、鸟嘌呤、胞嘧啶和胸腺嘧啶。它们的序列将为蛋白质编码并携带所有遗传信息。
核苷酸通过一个核苷酸的磷酸基和下一个核苷酸中戊糖的第3个碳原子之间的共价键连接在一起。因此,核苷酸的配对产生了糖-磷酸盐-糖-磷酸盐-等等的DNA骨架。这个序列形成一个多核苷酸链,2个盘绕的多核苷酸链产生了DNA的标志性双螺旋。

整个程序是基于一个简单的映射,其中2位序列被转换成核苷酸,每个核苷酸由一个字母(A、G、C或T)代表。
当DNA被测序时,有可能确定碱基的顺序,在普通的序列格式中,它们可以用一个字母表示。为了带来一个新的或修改过的序列,有可能将A、G、C或T移动一下。
关于DNA中的数字数据存储的更多信息,请阅读我以前的文章《数字数据存储的未来在于DNA》。
剖析该项目
起初,我用用户的输入设置了一个变量(original_str)。该文本的长度和内容可以不同,这完全取决于用户。
# set variable with input text
original_str = input("What would you like to convert? ")
然后,我使用了bytearray(source, encoding)方法,其中source是输入的文本(original_str),编码是UTF-8("utf-8")。UTF-8用1、2、3或4个字节表示输入文本中的每个字符。
因此,可以使用内置的 format(value, format_spec)
方法将每个整数值 (x) 转换为二进制,并通过指定格式 ("08b") 保留前导零。由此产生的二进制数包括所有前导0,总共有8位。因此,该字节列表用string.join(iterable)
方法连接,成为一个字符串(binary_str
)。
接下来,二进制字符串变成了一个列表(binary_list
),被分成2比特长的项目。因为2位变成了1个核苷酸,所以binary_list中的每个项目都应该有2的长度。
# convert text to binary values
binary_str = ''.join(format(x, '08b') for x in bytearray(original_str, 'utf-8'))
binary_list = [binary_str[i: i+2] for i in range(0, len(binary_str), 2)]
然后我定义了一个字典(DNA_encoding
),其中每个键代表二进制列表中可能的2位项目,每个值是其对应的核苷酸。
还设置了一个空列表(DNA_list
),DNA_encoding
中的值被附加到该列表中。一个for循环对二进制列表中的每一个2位项目进行迭代,另一个for循环对DNA_encoding
中的每一个键进行迭代。当2位项与一个键相匹配时,该键的值被添加到DNA_list中。
# binary values to nucleotide sequence
# remember:
# 00 = "A" (adenine)
# 01 = "G" (guanine)
# 10 = "C" (cytosine)
# 11 = "T" (thymine)
DNA_encoding = {
"00": "A",
"01": "G",
"10": "C",
"11": "T"
}
DNA_list = []
for num in binary_list:
for key in list(DNA_encoding.keys()):
if num == key:
DNA_list.append(DNA_encoding.get(key))
DNA_str = "".join(DNA_list)
当DNA_list中的所有核苷酸被连接在一起时,就会产生一个新的字符串(DNA_str
)。
最后,输入的文本(original_str
)、二进制字符串(binary_str
)和随后的核苷酸序列(DNA_str
)都被打印出来(\n只是为了格式化输出)。
# print input text, binary code and DNA sequence
print("\nThe original string is :" + "\n" + original_str + "\n")
print("The string after binary conversion is :" + "\n" + binary_str + "\n")
print("The string represented by single-letter codes is :" + "\n" + DNA_str + "\n")
下面是一个输出的例子。

这个项目的下一步是什么?
接下来,这个程序可以将文件、图片和视频转换为二进制序列,从而转换为核苷酸序列。通过包括不仅仅是文本,不同类型的信息可以被编码并存储在DNA中。另外,包括所产生的序列的文件可以被下载,以用于计算和统计技术的硅分析。
此外,由于有了更多的防护性编码,各种规则和算法可以更好地保护数据。从一系列具有不同安全程度的算法中,用户可以选择最能满足他们需求的算法,帮助他们完成目标。

用密码子对英文字母中的字符进行编码的另一种方式
最后,可以建立一个网站,使该程序更容易使用,并允许任何人将个人信息编码为基数序列。网上有许多文本到二进制和二进制到文本的转换器,为什么没有一个文本到核苷酸的转换器呢?
本文由mdnice多平台发布
网友评论