最近要做一个鱼类的线粒体进化树
然后有一百多个线粒体基因组序列号,因为数量太多了,一个个要从ncbi上下载,于是就分每个人下载40个。
原本手动的流程
- 打开ncbi
-
搜索accession ID
-
点进搜索结果
-
点击send to
-
选择cds DNA下载
-
选择cds protein下载
-
对下载后的fasta文件改名
-
然后重复40次
但我想到,经常会有人用python爬各种电子资料,是不是也可以从ncbi上一次性根据accession ID把这些数据都自动下载下来?而且让python给文件重命名肯定是非常简单的事情。
当然自己从零开始写肯定很麻烦,用现在最火的Cursor应该可以很快地完成任务。
使用Cursor编写python脚本
用了免费的ChatGPT o1-mini model,一分钟不到就把代码写好了。
让cursor解释一下脚本的运行原理
## 主要功能
1. 读取CSV文件:
- CSV文件应包含物种名称和对应的Accession Number。
- 脚本读取并解析这些信息,提取属名、种名以及Accession Number,并为每个Accession Number添加版本号。
2. 创建输出目录:
- 根据指定的输出目录(默认是 `output`),如果目录不存在则自动创建。
3. 从NCBI获取序列数据:
- 使用BioPython的`Entrez`模块连接NCBI数据库,根据Accession Number获取基因组的GenBank文件。
- 解析GenBank文件,提取CDS(编码序列)特征,包括基因名、蛋白质ID、位置信息等。
- 从CDS特征中提取核酸序列和蛋白质序列(如果有翻译信息)。
4. 保存序列到FASTA文件:
- 将提取的核酸序列保存到 `.fa` 文件中。
- 将提取的蛋白质序列保存到 `.pep.fa` 文件中。
- 如果某个Accession Number没有找到CDS或蛋白质翻译信息,则在对应的FASTA文件中写入注释。
手动检查一下有没有语法上的问题
运行测试文件,检查是不是可行
结果非常不错。
但是后来发现我上传了40个accession ID,结果只有60多个文件,本应该是80个文件(fa和pep.fa)。
检查了一下发现,原来我的csv文件中有一个物种对应多个线粒体基因组的情况,也就是他自动把一个物种的多个线粒体基因组合并了,这显然不是我想要的情况。
我又和cursor说,让他为每一个accession ID建立一个fa文件,并且在命名上修改,在结尾加上ac ID,方便辨认。
最后整个下载都很顺利完成了。
总结就是,理清逻辑,第一次完整的告诉cursor需求和上下文,然后通过不断测试不断迭代代码。因为一次性想到的需求都是有限的,而且有些时候AI可能不能很好地理解我们的需求
脚本和测试我放到我的公众“小竹读研在养鱼”上面了,有需要的可以在后台回复“mit download”,在文末获取