网页视频抓取脚本(如何用python3编写一个文件序列文件中的基因功能)

优采云 发布时间: 2022-01-31 04:16

  网页视频抓取脚本(如何用python3编写一个文件序列文件中的基因功能)

  操作说明

  在基因组分析中,我们经常有这样的需求,需要从fasta文件中提取一些序列。有时这些序列是完整的序列,有时它们只是原创 fasta 文件中序列的一部分。尤其是数据量大的时候,用肉眼来选择序列会很困难,那么我们可以通过简单的编程来实现。

  例如,一个物种的全基因组序列(0-refer/Bacillus_subtilis.str168.fasta)及其基因组gff注释文件(0-refer/Bacillus_subtilis.str168.gff)。这里假设我们对这个物种进行研究,通过gff注释文件中的基因功能描述字段定位一些特定的基因,加上相关数据的访问等。接下来,我们期望在全基因组序列中找到并提取这些基因fasta 文件根据 gff 文件中这些基因的位置描述,得到一个新的 fasta 文件,该文件只收录目标基因序列。

  请使用python3编写一个可以做到这一点的脚本。

  例子

  示例脚本如下(见网盘附件“seq_select1.py”)。

  为了达到上述目的,我们首先需要准备一个txt文件(以下简称list文件,示例list.txt可以在网盘附件中找到),根据记录的基因位置信息gff 文件,填写类似如下内容(列和列之间用制表符分隔)。

  1.png

  #将以下内容保存到list.txt

  基因46 NC_000964.3 42917 43660 +

  NP_387934.1 NC_000964.3 59504 60070 +

  yfmC NC_000964.3 825787 826734 -

  cds821 NC_000964.3 885844 886173 -

  在第 1 列中,为要获得的新序列命名;

  第二列,要获取的序列的原创序列ID;

  第3列,原创序列中要获取的序列的起始位置;

  第4列,原创序列中要得到的序列的终止位置;

  在第 5 列中,要获得的序列位于原创序列的正 (+) 或负 (-) 链上。

  然后根据输入文件编辑py脚本,即输入fasta文件和list文件中记录要获取的序列位置的内容。

  打开fasta文件“Bacillus_subtilis.scaffolds.fasta”,使用循环逐行读取序列id和碱基序列,将每个序列的所有碱基组合成一个字符串;基本序列存储为字典(字典样式 {'id':'base'})。

  打开列表文件“list.txt”,读取内容,存入字典。字典的键是列表文件中第一列的内容;字典的值是列表文件第2-5列的内容,除以tab得到一个列表,收录4个字符分别代表列表文件第2-5列的信息)。

  最后根据read list文件中的序列位置信息,从read基因组中截取目标基因序列。由于某些基因序列可能位于基因组的负链中,因此需要取反向互补序列。因此,首先定义一个函数rev(),以便在后续调用中获取反向互补序列。在输出序列名称时,还可以选择是否将序列的位置信息一起输出(name_detail = True/False)。

  #!/usr/bin/env python3

  # -*- 编码:utf-8 -*-

  #初始通过命令

  input_file = '枯草芽孢杆菌.str168.fasta'

  list_file = 'list.txt'

  output_file = 'gene.fasta'

  name_detail = 真

  ##读取文件

  #读取基因组序列

  seq_file = {}

  使用 open(input_file, 'r') 作为 input_fasta:

  对于 input_fasta 中的行:

  line = line.strip()

  如果行 [0] == '>':

  seq_id = line.split()[0]

  seq_file[seq_id] = ''

  别的:

  seq_file[seq_id] += 行

  input_fasta.close()

  #读取列表文件

  list_dict = {}

  使用 open(list_file, 'r') 作为 list_table:

  对于 list_table 中的行:

  如果 line.strip():

  line = line.strip().split('\t')

  list_dict[line[0]] = [line[1], int(line[2]) - 1, int(line[3]), line[4]]

  list_table.close()

  ##截取序列并输出

  #定义一个截取逆补的函数

  def rev(seq):

  base_trans = {'A':'T', 'C':'G', 'T':'A', 'G':'C', 'N':'N', 'a':'t' , 'c':'g', 't':'a', 'g':'c', 'n':'n'}

  rev_seq = 列表(反转(seq))

  rev_seq_list = [base_trans[k] for k in rev_seq]

  rev_seq = ''.join(rev_seq_list)

  返回(rev_seq)

  #截断序列并输出

  output_fasta = 打开(输出文件,'w')

  对于 list_dict.items() 中的键、值:

  如果名称_详细信息:

  print('>' + key, '[' + value[0], value[1] + 1, value[2], value[3] + ']', file = output_fasta)

  别的:

  打印('>' + 键,文件 = output_fasta)

  seq = seq_file['>' + value[0]][value[1]:value[2]]

  如果值 [3] == '+':

  打印(序列,文件= output_fasta)

  elif 值 [3] == '-':

  seq = rev(seq)

  打印(序列,文件= output_fasta)

  output_fasta.close()

  编辑好脚本后,运行并输出一个新的fasta文件“gene.fasta”,其序列就是我们要得到的目标基因序列。

  2.png

  延期:

  网盘附件“seq_select.py”是一个python3脚本,增加了命令行传输线,可以直接在shell中对目标文件进行I/O处理。该脚本可以指定一个输入fasta序列文件和一个记录要提取的序列位置的列表文件,新的输出fasta文件就是提取的序列。

  #!/usr/bin/env python3

  # -*- 编码:utf-8 -*-

  #导入模块,初始传递命令、变量等

  导入参数解析

  parser = argparse.ArgumentParser(description = '\n该脚本用于截取基因组中特定位置的序列,并额外输入截取序列信息的列表文件', add_help = False, usage = '\npython3 seq_select.py -i [ input.fasta] -o [output.fasta] -l [list]\npython3 seq_select.py --input [input.fasta] --output [output.fasta] --list [list]')

  required = parser.add_argument_group('必需选项')

  可选 = parser.add_argument_group('可选')

  required.add_argument('-i', '--input', metavar = '[input.fasta]', help = '输入文件, fasta 格式', required = True)

  required.add_argument('-o', '--output', metavar = '[output.fasta]', help = '输出文件,fasta 格式', required = True)

  required.add_argument('-l', '--list', metavar = '[list]', help = 'record "新序列名称/原序列的序列ID/序列起始位置/序列结束位置/正链( +) 或负链 (-)",以制表符分隔,必填 = True)

  optional.add_argument('--detail', action = 'store_true', help = '如果该参数存在,则在输出fasta的每个sequence id中显示序列在原创fasta中的位置信息', required = False)

  optional.add_argument('-h', '--help', action = 'help', help = '帮助信息')

  args = parser.parse_args()

  ##读取文件

  #读取基因组序列

  seq_file = {}

  使用 open(args.input, 'r') 作为 input_fasta:

  对于 input_fasta 中的行:

  line = line.strip()

  如果行 [0] == '>':

  seq_id = line.split()[0]

  seq_file[seq_id] = ''

  别的:

  seq_file[seq_id] += 行

  input_fasta.close()

  #读取列表文件

  list_dict = {}

  使用 open(args.list, 'r') 作为 list_file:

  对于 list_file 中的行:

  如果 line.strip():

  line = line.strip().split('\t')

  list_dict[line[0]] = [line[1], int(line[2]) - 1, int(line[3]), line[4]]

  list_file.close()

  ##截取序列并输出

  #定义一个截取逆补的函数

  def rev(seq):

  base_trans = {'A':'T', 'C':'G', 'T':'A', 'G':'C', 'a':'t', 'c':'g' , 't':'a', 'g':'c'}

  rev_seq = 列表(反转(seq))

  rev_seq_list = [base_trans[k] for k in rev_seq]

  rev_seq = ''.join(rev_seq_list)

  返回(rev_seq)

  #截断序列并输出

  output_fasta = open(args.output, 'w')

  对于 list_dict.items() 中的键、值:

  如果 args.detail:

  print('>' + key, '[' + value[0], value[1] + 1, value[2], value[3] + ']', file = output_fasta)

  别的:

  打印('>' + 键,文件 = output_fasta)

  seq = seq_file['>' + value[0]][value[1]:value[2]]

  如果值 [3] == '+':

  打印(序列,文件= output_fasta)

  elif 值 [3] == '-':

  seq = rev(seq)

  打印(序列,文件= output_fasta)

  output_fasta.close()

  使用上面示例中的测试文件,脚本运行如下。

  #python3 seq_select.py -h

  python3 seq_select.py -i Bacillus_subtilis.str168.fasta -l list.txt -o gene.fasta --detail

  3.png

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线