ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用 Cursor 配 TaoToken:几句话生成批量下载 NCBI 线粒体基因组的 Python 脚本

用 Cursor 配 TaoToken:几句话生成批量下载 NCBI 线粒体基因组的 Python 脚本 1. 从一百多个 accession 到一堆乱名文件生物信息里最磨人的那一步如果你做的是鱼类线粒体进化树这类课题手上大概率会有一张表物种名一列NCBI accession 号一列动辄几十上百行。真正折磨人的不是建树而是建树之前那段“体力活”——打开 NCBI搜 accession点进结果Send to选 CDS nucleotide 下载再选 CDS protein 下载下载完还要手动改名然后重复四十次。一个下午过去文件夹里躺着一堆sequence.fasta、sequence(1).fasta你根本分不清哪个对应哪个物种。这篇要解决的就是这件事用 Cursor 配合 TaoToken 的统一 Key/API 通道几句话生成一个能批量从 NCBI 抓取线粒体基因组、自动按 accession 命名、同时导出核酸和蛋白 FASTA 的 Python 脚本。适合正在做线粒体基因组、系统发育、条形码分析的生物信息同学也适合任何需要按 accession 批量拉取 NCBI 序列的人。目标很直接把原本一天的手工操作压到几分钟而且脚本可复用、可迭代。我试过纯手工下载四十个 accession中途还因为文件名重复覆盖了两个物种最后对不上号只能重下。所以下面这套流程重点不只是“让 AI 写代码”而是把需求一次讲清楚、把命名规则定死、把结果校验做掉。2. 为什么用 Cursor TaoToken 而不是直接裸连Cursor 本身是个编辑器它的 AI 能力需要接一个模型通道。很多人卡在第一步要么用默认通道额度不够、要么配置繁琐、要么在团队里每个人各配一套 Key管理混乱。TaoToken 在这里的作用是提供一个统一的 Key 和 API 通道把模型调用收敛到一个地址上Cursor、脚本、其他工具都能复用同一个入口。对生物信息场景来说这一点其实挺关键。你写脚本时可能要反复让模型解释报错、改命名逻辑、补异常处理调用次数不少。统一通道意味着你不用在多个工具之间来回换 Key配置一次Cursor 里改代码、终端里跑脚本、后续接别的分析流程都走同一个 API 地址。需要先说明的是TaoToken 是模型 API 的接入通道不是用来替代 Cursor 编辑器的也不是数据库本身。NCBI 的数据抓取仍然靠 BioPython 的 Entrez 模块完成TaoToken 负责的是“让 Cursor 里的 AI 稳定可用”这一层。两者分工别搞混。3. 前置准备Key、config.toml 骨架与 Cursor 配置片段3.1 拿到统一 Key先去控制台创建一个 API Key地址是https://taotoken.net/api-keys。创建后复制出来后面配置里要用。这个 Key 就是你所有模型调用的凭证别写进会提交到 Git 的脚本里建议放环境变量或本地配置文件。3.2 config.toml 骨架Cursor 支持通过配置文件指定模型通道。下面是一个可用的骨架把api_key换成你自己的# ~/.cursor/config.toml 或项目内 .cursor/config.toml [models.custom.taotoken] provider openai api_key sk-你的TaoTokenKey base_url https://taotoken.net/api model claude-sonnet-4-20250514 [chat] default_model taotoken这里base_url用的是 API 地址https://taotoken.net/api注意不要带多余的路径后缀。model字段按你实际想用的模型填写脚本这种任务用带代码能力的模型就行。3.3 Cursor 里的配置片段如果你不想改全局配置也可以在 Cursor 设置里手动填。打开 Settings搜索模型相关配置选择自定义 provider填入{ provider: openai-compatible, baseUrl: https://taotoken.net/api, apiKey: sk-你的TaoTokenKey, model: claude-sonnet-4-20250514 }保存后重启 Cursor在对话窗口里发一句“你好”测试通道是否通。通了再往下走。如果这里报 401八成是 Key 复制时带了空格报 404检查 base_url 是不是多写了/v1之类。3.4 Python 环境脚本依赖 BioPython先装好pip install biopython pandasNCBI 的 Entrez 接口建议配一个邮箱方便出问题时 NCBI 能联系你也符合他们的使用规范export NCBI_EMAILyour_emailexample.com4. 让 Cursor 生成脚本把需求一次讲清楚4.1 给 Cursor 的提示词别只说“帮我写个下载 NCBI 序列的脚本”那样出来的代码命名规则大概率不合你意。把下面这段直接丢给 Cursor用 Python 写一个脚本从 NCBI 批量下载线粒体基因组序列。 输入一个 CSV 文件包含两列 species 和 accession。 要求 1. 读取 CSV为每个 accession 单独处理不要合并同一物种的多个 accession。 2. 用 BioPython 的 Entrez 拉取 GenBank 记录。 3. 提取 CDS 的核酸序列保存为 {accession}.fa。 4. 提取 CDS 的蛋白序列保存为 {accession}.pep.fa。 5. 每个 accession 生成独立文件文件名结尾必须带 accession 号。 6. 如果某个 accession 没有 CDS 或没有翻译在对应文件里写注释说明。 7. 加异常处理和重试网络失败不要中断整个批次。关键点在第 1 条和第 5 条。原场景里踩的坑就是“一个物种对应多个线粒体基因组时被合并了”所以必须明确“每个 accession 独立成文件”。4.2 生成的核心脚本Cursor 产出的代码大致如下我做了整理你可以直接存成download_mito.pyimport os import time import pandas as pd from Bio import Entrez, SeqIO Entrez.email os.environ.get(NCBI_EMAIL, your_emailexample.com) OUTPUT_DIR output MAX_RETRY 3 RETRY_WAIT 5 def fetch_genbank(accession): for attempt in range(MAX_RETRY): try: handle Entrez.efetch( dbnuccore, idaccession, rettypegbwithparts, retmodetext, ) record SeqIO.read(handle, genbank) handle.close() return record except Exception as e: print(f[retry {attempt1}] {accession}: {e}) time.sleep(RETRY_WAIT) return None def extract_cds(record, accession): nuc_seqs, pep_seqs [], [] for feature in record.features: if feature.type ! CDS: continue gene feature.qualifiers.get(gene, [unknown])[0] protein_id feature.qualifiers.get(protein_id, [unknown])[0] nuc feature.extract(record.seq) nuc_seqs.append((gene, protein_id, nuc)) translation feature.qualifiers.get(translation) if translation: pep_seqs.append((gene, protein_id, translation[0])) return nuc_seqs, pep_seqs def write_fasta(path, entries, header_prefix): with open(path, w) as f: if not entries: f.write(f# no CDS found for {header_prefix}\n) return for gene, pid, seq in entries: f.write(f{header_prefix}|{gene}|{pid}\n{seq}\n) def main(csv_path): os.makedirs(OUTPUT_DIR, exist_okTrue) df pd.read_csv(csv_path) for _, row in df.iterrows(): accession str(row[accession]).strip() record fetch_genbank(accession) if record is None: print(f[skip] {accession} fetch failed) continue nuc_seqs, pep_seqs extract_cds(record, accession) write_fasta( os.path.join(OUTPUT_DIR, f{accession}.fa), nuc_seqs, accession, ) write_fasta( os.path.join(OUTPUT_DIR, f{accession}.pep.fa), pep_seqs, accession, ) print(f[done] {accession}: {len(nuc_seqs)} CDS, {len(pep_seqs)} pep) time.sleep(0.4) if __name__ __main__: main(accessions.csv)CSV 长这样species,accession Danio rerio,NC_002333.2 Cyprinus carpio,NC_001606.14.3 命名规则为什么这么定文件名用{accession}.fa和{accession}.pep.fa好处是排序后同一 accession 的核酸和蛋白文件挨在一起肉眼就能配对。FASTA 头里再带上accession|gene|protein_id后续做比对或建树时不会丢来源信息。这一步定死能省掉后面大量对账时间。5. 跑一次批量下载与结果校验5.1 执行python download_mito.py终端会逐行打印每个 accession 的 CDS 和蛋白数量。正常输出类似[done] NC_002333.2: 13 CDS, 13 pep [done] NC_001606.1: 13 CDS, 13 pep5.2 校验文件数量假设 CSV 里有 40 个 accession理论上应该产出 80 个文件。用一条命令核对ls output/*.fa | wc -l ls output/*.pep.fa | wc -l两个数字都应该等于 accession 数量。如果少了先看是不是某个 accession 抓取失败被 skip 了终端日志里会标[skip]。5.3 校验内容抽查一个文件head -4 output/NC_002333.2.fa grep -c output/NC_002333.2.fagrep -c 数出来的就是 CDS 条数和终端打印的数字对得上就说明提取逻辑没问题。再确认一下没有出现“一个物种多个 accession 被合并”的情况——每个 accession 都应该有自己独立的文件文件名里带 accession 号。5.4 用 TaoToken 的模型对话做二次检查如果某个 accession 的 CDS 数量明显偏少可以把 GenBank 记录片段贴到模型对话里让它帮你判断是不是注释本身就不全。模型对话入口在https://taotoken.net/models走的是同一个 Key不用重新配。6. 本篇常见错排查6.1 报 401 UnauthorizedKey 错了或过期。回控制台重新生成一个注意复制时别带首尾空格。config.toml 里api_key字段用引号包起来。6.2 报 404 Not Foundbase_url写错了。正确值是https://taotoken.net/api不要在后面加/v1或/chat/completions那些由客户端自己拼。6.3 Entrez 返回空记录accession 号写错或者该号在 nuccore 库里不存在。先用浏览器打开 NCBI 确认这个号能搜到。另外注意版本号NC_002333和NC_002333.2是两个不同的 id脚本里最好带版本号。6.4 文件数量对不上最常见的原因就是同一物种多个 accession 被合并。检查脚本里是不是按 accession 循环、文件名是不是带 accession。如果 Cursor 第一版没写对直接把“每个 accession 独立成文件、文件名结尾带 accession”这句话再强调一遍让它改。6.5 蛋白文件是空的有些 GenBank 记录的 CDS 没有translation字段脚本会写一行注释。这不是 bug是数据本身的问题。可以在脚本里加个统计最后汇总哪些 accession 缺蛋白序列。6.6 请求太频繁被限流NCBI 对匿名请求有频率限制。脚本里已经加了time.sleep(0.4)如果 accession 特别多可以调到 0.5 到 1 秒。配了NCBI_EMAIL之后限额会宽松一些。6.7 Cursor 里模型不响应先确认 config.toml 的default_model和[models.custom.taotoken]名字对得上。改完配置要重启 Cursor。如果还是不行用模型对话入口单独测一下 Key 是否有效排除是 Cursor 配置问题还是 Key 问题。7. 把通道固定下来后面的事就顺了这套流程跑通之后你会发现真正花时间的不是写脚本而是第一次把需求讲清楚。命名规则、独立文件、异常处理这三条定死后面换物种、换基因、换数据库改几行就能复用。Cursor 负责快速产出和迭代TaoToken 负责把模型调用收敛到一个稳定入口NCBI 那边交给 BioPython。如果你后面要长期做这类批量抓取和序列处理建议把 Key 和通道固定下来别每次换工具就重配一遍。API Key 在https://taotoken.net/api-keys管理接入文档在https://taotoken.net/doc模型对话在https://taotoken.net/models。写脚本、调报错、做结果校验走同一个通道就够了。
返回列表