ncbi虽然有提供批量下载蛋白序列和基因序列的方法,但是一次性最多好像只能下载300条序列, https://www.ncbi.nlm.nih.gov/sites/batchentrez,但是对于我们生信分析来说,有点不够用了,因为平时 可能需要下载几百、上千条序列;
在这里我就给各位提供个快速下载序列的方法:
首先在各位安装的python上安装一个包:ncbi-acc-download
这个包提供根据assession number来批量下载多条序列,如果各位想知道具体用法,可以--h看看功能,我这里就不具体阐述;
我这里举一个例子,用cazy网站下载的txt文件去ncbi批量下载序列:
我们这里可以看到总共需要300多万的序列;
如果去ncbi下载,得下到猴年马月去,所以果断使用python脚本来获取;
import subprocess
from multiprocessing import Pool
import glob
import os
protein_set = set()
with open('cazy_data.txt', 'r') as fr:
lines = fr.readlines()
for line in lines:
ncbi_protein = line.split('\t')[3].strip()
protein_set.add(ncbi_protein)
def downlad_protein(i):
run = f'ncbi-acc-download --format fasta --m protein {i} --api-key {api-key}'
try:
subprocess.run(run, shell=True)
if os.path.exists(f'{i}.fa'):
with open('cazy1.fasta', 'a') as outfile:
with open(f'{i}.fa', 'r') as infile:
outfile.write(infile.read())
subprocess.run(f'rm {i}.fa', shell=True)
except subprocess.CalledProcessError as e:
print(f"Error downloading {i}: {e}")
def multi_run_cmds():
with Pool(processes = 10) as pool:
results = [pool.apply_async(downlad_protein, (i,)) for i in protein_set]
# 等待所有异步任务完成
for result in results:
result.get()
if __name__ == "__main__":
multi_run_cmds()
这个脚本里有2点很重要,如果你们有需要可以自行修改:
1.api-key参数,这个参数是ncbi指定的,如果你不加这个参数,只能每秒获取3个,加了这个参数这个以后每秒可以获取10个;
2.我后面用了pool池来并行这个运行,因为需要300多万个,不并行得话,下载得太慢了,然后是10个线程并行得,你们可以根据自己需要修改。
这就是批量下载基因序列和蛋白序列得方法了,如果有啥问题,可以留言,我会及时回复得!