资讯动态

Python EGA下载客户端:批量下载与断点续传实战指南

发布时间:2026/10/14 13:22:10 来源:尧图企业网站定制
简介pyEGA3 是一款基于 Python 的 EGA 数据下载客户端面向需要访问授权 EGA 数据集的生物信息学研究者与数据分析人员帮助解决受控数据在安全传输、断点续传与完整性校验上的下载难题。资源包共 19 个文件约 31KB以 py 源码与 sh 依赖安装脚本为主辅以 json 配置、md 说明文档、cfg 与 yml 构建配置等覆盖主程序、测试用例及多平台环境部署脚本结构紧凑、便于快速上手。该工具通过 https 安全连接传输未加密文件下载后无需解密支持断点续传、文件分段并行下载以及基于校验和的完整性验证并实现 GA4GH 兼容的 htsget 协议可按基因组范围下载带索引的数据文件。目前已有 1178 人学习下载适合具备 Python 3.6 以上环境、希望高效获取 EGA 授权数据并掌握其下载与校验流程的读者参考。1. 一个基于Python的EGA下载客户端到底解决什么问题做生物信息的人大概率都经历过这种场景从公共数据库拿到一个数据集编号兴冲冲打开网页准备下载结果发现文件列表长得像天书几十上百个样本文件要一个个点点到手酸还容易漏。EGAEuropean Genome-phenome Archive作为存放受控访问基因组数据的核心仓库它的下载流程比普通FTP复杂得多——需要申请权限、拿到凭证、再通过专门的客户端工具拉取数据。ega-download-client 就是一个基于 Python 的轻量级下载客户端把这一整套流程封装成了命令行工具和 Python API。它解决的核心痛点有三个第一把「申请权限→获取凭证→下载文件」这条链路自动化不用手动在网页上反复操作第二支持断点续传和批量下载大文件跑到一半断了不用从头再来第三提供 Python 接口方便把下载步骤嵌进自己的分析流水线里。适合的人群很明确做基因组学、转录组学分析的科研人员以及需要从 EGA 批量拉取受控数据做二次分析的生物信息工程师。如果你只是偶尔下载一两个公开文件用网页就够了但如果你面对的是几十个样本、上百GB的数据集这个工具能帮你省下大量重复劳动。2. 环境搭建与凭证配置从零到能跑通第一条命令2.1 Python 环境与依赖安装的选型理由ega-download-client 本质上是一个 Python 包依赖 requests、tqdm 等常见库。我一般建议用 conda 建一个独立环境避免和系统 Python 或其他分析工具的依赖打架。为什么不用 pip 直接装到全局因为生物信息分析环境里经常同时跑着好几个工具版本冲突是家常便饭隔离环境是后悔药。# 创建独立环境Python 版本建议 3.8 以上 conda create -n ega-download python3.10 -y conda activate ega-download # 安装客户端常见做法是从 PyPI 安装 pip install ega-download-client # 验证安装是否成功 ega-download-client --version安装完成后你会得到一个命令行入口ega-download-client。如果提示找不到命令大概率是环境没激活或者 PATH 没配好先which ega-download-client确认一下路径。参数说明-n指定环境名随便取但要自己能记住python3.10是版本约束太低可能不支持某些新特性太高可能部分依赖还没适配。我一般用 3.9 或 3.10比较稳。2.2 凭证文件放在哪、怎么配EGA 的受控数据下载需要凭证通常是一个 JSON 格式的配置文件里面包含你的账号信息和密钥。这个文件一般由数据访问委员会在批准权限后提供或者你自己在 EGA 账户页面生成。# 凭证文件通常长这样保存为 ~/.ega/credentials.json # 注意这是示例结构实际字段以你拿到的文件为准{ username: your_account, password: your_password, ega_api_key: your_api_key_here }# 设置权限避免其他用户读到 chmod 600 ~/.ega/credentials.json # 测试凭证是否有效 ega-download-client list-datasets --credentials ~/.ega/credentials.json逻辑说明list-datasets是一个只读操作用来验证凭证能不能正常通过认证。如果这一步就报 401 或 403说明凭证有问题别急着往下走。参数--credentials指定凭证文件路径如果你放在默认位置有些版本可以省略这个参数。注意凭证文件千万不要提交到 Git 仓库或者放在共享目录里。我见过有人把密钥推到公开仓库结果权限被临时冻结折腾了好几天才恢复。3. 下载流程拆解从数据集编号到本地文件3.1 查询数据集与文件清单拿到一个 EGA 数据集编号通常以 EGAD 开头后第一步是查清楚里面有哪些文件、多大、什么格式。这一步很多人跳过直接开下载结果下了一堆不需要的 BAM 文件浪费时间和磁盘。# 查询数据集下的文件列表 ega-download-client list-files \ --dataset EGAD00001000001 \ --credentials ~/.ega/credentials.json \ --output file_list.tsv逻辑说明list-files会返回一个表格包含文件名、大小、校验值等信息。--output把结果存成 TSV方便后续用 Excel 或 pandas 筛选。参数--dataset就是你的数据集编号注意大小写敏感。拿到文件列表后我一般会先看一眼总大小和文件类型分布。如果里面有大量 CRAM 文件而你只需要 VCF就可以在后续下载时用过滤条件排除掉。3.2 批量下载与断点续传确认文件清单后就可以开始下载了。ega-download-client 支持按数据集下载、按文件列表下载、以及带过滤条件的下载。# 按数据集整体下载输出到指定目录 ega-download-client download \ --dataset EGAD00001000001 \ --credentials ~/.ega/credentials.json \ --output-dir ./ega_data \ --max-retries 5 \ --continue # 如果只想下载特定文件可以用文件列表 ega-download-client download \ --file-list selected_files.txt \ --credentials ~/.ega/credentials.json \ --output-dir ./ega_data逻辑说明--output-dir指定本地保存目录工具会自动创建子目录结构--max-retries 5表示单个文件失败后最多重试 5 次网络不稳定时很有用--continue开启断点续传已经下载完整的文件会跳过下了一半的文件会从断点继续。这个参数是血泪经验——没有它一次网络抖动就可能让你从头再来。参数说明--file-list接受一个每行一个文件名的文本文件适合你已经在list-files结果里筛选过的情况。注意文件列表里的文件名要和 EGA 返回的完全一致包括扩展名。3.3 下载状态的监控与日志批量下载最怕的是跑了一晚上早上起来发现卡在某个文件上不动了。ega-download-client 默认会在终端输出进度条但如果你是在后台跑就需要看日志。# 后台运行并记录日志 nohup ega-download-client download \ --dataset EGAD00001000001 \ --credentials ~/.ega/credentials.json \ --output-dir ./ega_data \ --continue \ ega_download.log 21 # 查看实时进度 tail -f ega_download.log # 查看已下载文件的总大小 du -sh ./ega_data逻辑说明nohup让命令在终端关闭后继续运行 ega_download.log 21把标准输出和错误都重定向到日志文件。tail -f实时看进度du -sh看已经下了多少。如果发现日志长时间没有新行可能是卡住了需要检查网络或凭证是否过期。注意有些版本的客户端在下载大文件时会先写一个临时文件下载完成后再重命名。如果你看到目录里有一堆.part或.tmp后缀的文件说明还在下载中不要手动去改文件名。4. 避坑与排查那些让我熬夜的常见问题4.1 凭证过期导致下载中断现象下载跑了一半突然报 401 Unauthorized日志里显示认证失败。原因EGA 的访问令牌通常有有效期长时间下载任务可能跨过过期时间点。解决重新生成凭证文件然后重新运行下载命令。因为开了--continue已经下完的文件不会重复下载。如果频繁遇到这个问题可以考虑在下载脚本里加一个定时刷新凭证的逻辑或者把大任务拆成多个小批次。4.2 磁盘空间不足导致写入失败现象下载到某个大文件时突然报错提示 No space left on device。原因基因组数据动辄几十上百 GB很容易把磁盘塞满。更隐蔽的情况是临时目录和输出目录不在同一个分区临时目录先满了。解决下载前用df -h确认输出目录所在分区的可用空间至少留出数据集总大小的 1.5 倍。如果临时目录空间紧张可以通过环境变量TMPDIR把临时目录指到大分区上。# 下载前检查磁盘空间 df -h ./ega_data # 如果临时目录空间不够指定到大分区 export TMPDIR/big_disk/tmp4.3 文件名特殊字符导致下载失败现象大部分文件都下成功了但有几个文件反复报错日志里显示文件名包含特殊字符。原因EGA 上的文件名可能包含空格、括号、中文等字符某些操作系统或文件系统对特殊字符处理不一致。解决先手动下载这几个文件或者用--file-list逐个指定。如果文件名里有空格确保在文件列表里用引号包起来。我一般会在list-files之后先用脚本把文件名里的特殊字符替换掉再生成下载列表。4.4 网络不稳定导致大量重试现象日志里满屏的 retry 记录下载速度极慢。原因跨国网络链路不稳定或者本地网络有丢包。解决适当增大--max-retries和重试间隔但更重要的是检查本地网络。如果条件允许把下载任务安排在网络空闲时段跑。另外有些版本的客户端支持--timeout参数可以调整单次请求的超时时间默认值可能偏短。4.5 权限不足导致部分文件无法下载现象数据集里有些文件能下有些报 403 Forbidden。原因你的访问权限可能只覆盖了数据集的一部分文件或者某些文件有额外的使用限制。解决用list-files确认哪些文件有权限哪些没有。如果确实需要那些没权限的文件需要联系数据访问委员会申请扩展权限。不要试图绕过权限控制这在学术圈是红线。5. 把下载嵌进分析流水线Python API 与自动化技巧5.1 用 Python API 替代命令行调用命令行适合手动操作但如果你要把下载步骤嵌进 Snakemake、Nextflow 或者自己的 Python 脚本里直接调 API 更顺手。from ega_download_client import EGAClient # 初始化客户端指定凭证文件 client EGAClient(credentials_path~/.ega/credentials.json) # 查询数据集文件列表 files client.list_files(dataset_idEGAD00001000001) for f in files: print(f.name, f.size, f.status) # 下载指定文件支持断点续传 client.download_files( dataset_idEGAD00001000001, output_dir./ega_data, file_names[sample1.bam, sample2.bam], continue_downloadTrue, max_retries5 )逻辑说明EGAClient是核心类初始化时传入凭证路径。list_files返回文件对象列表每个对象包含名称、大小、状态等属性。download_files支持指定文件名列表只下你需要的文件。continue_downloadTrue对应命令行的--continuemax_retries对应--max-retries。参数说明file_names如果不传默认下载数据集下所有有权限的文件。output_dir会自动创建。注意凭证路径里的~在 Python 里不会自动展开最好用os.path.expanduser处理一下。5.2 下载完成后的校验与整理下载完成后第一件事是校验文件完整性。EGA 通常提供 MD5 或 SHA256 校验值list-files的结果里就有。import hashlib def verify_md5(file_path, expected_md5): 校验文件 MD5 是否与预期一致 hash_md5 hashlib.md5() with open(file_path, rb) as f: for chunk in iter(lambda: f.read(4096), b): hash_md5.update(chunk) actual hash_md5.hexdigest() return actual expected_md5 # 从 list-files 结果里拿到预期 MD5逐个校验 for f in files: local_path f./ega_data/{f.name} if verify_md5(local_path, f.md5): print(f{f.name} 校验通过) else: print(f{f.name} 校验失败需要重新下载)逻辑说明分块读取文件计算 MD5避免一次性把大文件读进内存。校验失败的文件记录下来下次下载时单独指定重下。这一步看起来多余但基因组数据文件大传输过程中出错的概率不低校验是最后的防线。5.3 一个实用的批量下载脚本模板把上面的步骤串起来就是一个可复用的下载脚本。我一般会把它保存成download_ega.py每次改一下数据集编号和输出目录就能用。import os import sys from ega_download_client import EGAClient DATASET_ID EGAD00001000001 OUTPUT_DIR ./ega_data CREDENTIALS os.path.expanduser(~/.ega/credentials.json) def main(): # 检查磁盘空间 stat os.statvfs(OUTPUT_DIR if os.path.exists(OUTPUT_DIR) else .) free_gb (stat.f_bavail * stat.f_frsize) / (1024 ** 3) print(f可用空间: {free_gb:.1f} GB) if free_gb 50: print(空间不足退出) sys.exit(1) client EGAClient(credentials_pathCREDENTIALS) files client.list_files(dataset_idDATASET_ID) print(f数据集共 {len(files)} 个文件) client.download_files( dataset_idDATASET_ID, output_dirOUTPUT_DIR, continue_downloadTrue, max_retries5 ) print(下载完成) if __name__ __main__: main()逻辑说明脚本先检查磁盘空间低于 50GB 直接退出避免下到一半空间不够。然后初始化客户端、查询文件列表、执行下载。continue_downloadTrue保证脚本可以反复运行已经下完的文件不会重复下载。参数说明DATASET_ID和OUTPUT_DIR是每次需要改的变量。CREDENTIALS用expanduser展开用户目录。磁盘空间阈值 50GB 是经验值根据你的数据集大小调整。5.4 几个让下载更稳的小技巧第一个技巧是分批下载。如果一个数据集有几百个文件不要一次性全下按样本或按文件类型分成几批每批跑完校验一遍。这样出问题时影响范围小排查也容易。第二个技巧是记录下载日志。除了客户端自带的日志我习惯在脚本里额外记录每个文件的下载开始时间、结束时间、大小和校验结果存成一个 TSV。后面如果发现某个文件有问题翻日志比翻终端输出快得多。第三个技巧是设置合理的超时和重试间隔。默认的超时时间可能不适合你的网络环境如果经常遇到超时适当调大--timeout但也不要太大否则卡住的时候要等很久才发现。参数建议值说明max-retries5单个文件最大重试次数timeout300单次请求超时秒数网络差可调大continueTrue断点续传必开output-dir独立分区避免和系统盘抢空间这些参数没有万能值需要根据你的网络环境和数据集大小微调。我一般会先用一个小数据集跑一遍确认参数合适了再上大任务。说到底ega-download-client 这类工具的价值不在于技术有多复杂而在于它把一件重复、易错的事情变得可自动化、可复现。我自己的习惯是任何需要手动点超过三次的操作都值得写个脚本。下载 EGA 数据这件事手动点一次可能只要十分钟但如果你每个月都要下几个数据集一年下来就是几十个小时。把这些时间省下来做分析才是正经事。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑