如何用Python从UniProt获取蛋白序列并构建Colab自定义FASTA工具?
Google Colab批量生成重复序列FASTA工具
需求概述
输入参数示例
Name = protein_sequences Proteins = 2xUniprot1, 3xUniprot2, 1xUniprot3 Directory = FASTA_directory
期望输出
生成名为protein_sequences.fasta的文件,内容如下:
> protein_sequences sequenceUniprot1:sequenceUniprot1:sequenceUniprot2:sequenceUniprot2:sequenceUniprot2:sequenceUniprot3
核心问题解决:高效获取UniProt序列
目前获取UniProt蛋白序列最稳定高效的方式是使用官方REST API,无需额外安装复杂库,用Python的requests库即可实现:
- 单条序列请求URL格式:
https://rest.uniprot.org/uniprotkb/{uniprot_id}.fasta - 解析返回的FASTA文本,跳过以
>开头的注释行,提取纯序列内容
完整Colab代码实现
# 挂载Google Drive from google.colab import drive drive.mount('/content/drive') import requests import os # -------------------------- 自定义参数 -------------------------- file_name = "protein_sequences" # FASTA文件名(无需加.fasta后缀) proteins_input = "2xP01308, 3xP02768, 1xP60709" # 格式:数量xUniProtID,多个用逗号分隔 save_dir = "FASTA_directory" # Drive中保存文件的目录名 # --------------------------------------------------------------- # 处理输入条目,去除空格并拆分 protein_list = [item.strip() for item in proteins_input.split(',')] # 创建Drive保存目录(不存在则自动创建) save_path = f"/content/drive/MyDrive/{save_dir}" os.makedirs(save_path, exist_ok=True) sequence_parts = [] for protein in protein_list: # 拆分重复次数与UniProt ID count_str, uniprot_id = protein.split('x') repeat_count = int(count_str) # 请求UniProt获取FASTA序列 url = f"https://rest.uniprot.org/uniprotkb/{uniprot_id}.fasta" response = requests.get(url) response.raise_for_status() # 请求失败时直接抛出异常 # 提取纯序列内容 fasta_lines = response.text.splitlines() raw_sequence = ''.join([line for line in fasta_lines if not line.startswith('>')]) # 按指定次数重复序列,添加到片段列表 sequence_parts.extend([raw_sequence] * repeat_count) # 拼接所有序列片段,用冒号分隔 full_sequence = ':'.join(sequence_parts) # 生成FASTA格式内容 fasta_content = f"> {file_name} {full_sequence}\n" # 保存文件到Drive output_file_path = os.path.join(save_path, f"{file_name}.fasta") with open(output_file_path, 'w') as f: f.write(fasta_content) print(f"文件已成功保存至: {output_file_path}")
使用说明
- 运行代码第一步会提示授权挂载Google Drive,按指引完成授权即可
- 修改代码中「自定义参数」区块的内容为你的实际需求
- 若需批量处理大量UniProt ID,建议在循环中添加
time.sleep(0.5)延迟,避免触发API请求频率限制
内容的提问来源于stack exchange,提问作者Sofia
相关产品推荐
相关产品推荐

