You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BioPython的Bio.PDB模块下载PDB文件时遇550错误求助

解决Bio.PDB下载PDB文件时的550目录错误问题

看起来你遇到的这个550 Can't change directory错误,大概率是PDB编号格式不对或者BioPython的PDBList默认参数适配问题导致的,我帮你梳理几个解决方案:

首先排查PDB编号的有效性

你错误里提到的pdb1p87.ent.gz,推测是DataFrame里的某个PDB编号格式有问题——比如是小写、带了多余后缀,或者根本不是有效的4字符PDB编号。先做这两步:

  • 先把所有要下载的编号打印出来检查:
    print(df['Structure_(PDB)_id'].tolist())
    
    看看有没有空格、小写字母、或者长度不对的编号(比如超过4位)。
  • 在你的get_pdb函数里加个标准化处理,确保编号符合要求:
    def get_pdb(accession, dir='/Users/my_folder'):
        # 清理编号:去空格、转大写、只保留前4个字符
        clean_acc = accession.strip().upper()[:4]
        pdb1 = PDBList()
        pdb1.retrieve_pdb_file(clean_acc, pdir=dir)
    

调整retrieve_pdb_file的参数适配新的RCSB结构

旧版的PDB命名格式(比如pdbxxxx.ent.gz)对应的FTP目录结构可能已经有变化,改用新的命名方式和参数能避免这个问题:

def get_pdb(accession, dir='/Users/my_folder'):
    clean_acc = accession.strip().upper()[:4]
    pdb1 = PDBList()
    # 指定file_format为pdb,会使用新的命名(比如1P87.pdb.gz),同时跳过废弃的PDB文件
    pdb1.retrieve_pdb_file(clean_acc, pdir=dir, file_format='pdb', obsolete=False, overwrite=False)

overwrite=False还能避免重复下载已经存在的文件,节省时间。

加上错误处理避免循环中断

如果某个编号确实无效,加个try-except块能让循环继续跑下去,还能记录失败的编号:

def get_pdb(accession, dir='/Users/my_folder'):
    clean_acc = accession.strip().upper()[:4]
    pdb1 = PDBList()
    try:
        pdb1.retrieve_pdb_file(clean_acc, pdir=dir, file_format='pdb', obsolete=False, overwrite=False)
        print(f"✅ 成功下载 {clean_acc}")
    except Exception as e:
        print(f"❌ 下载 {clean_acc} 失败:{str(e)}")

# 遍历DataFrame的编号列
for pdb_id in df['Structure_(PDB)_id']:
    get_pdb(pdb_id)

额外检查目录权限

确保/Users/my_folder目录有读写权限,你可以在终端里运行:

ls -ld /Users/my_folder

如果权限不对,用chmod调整一下,比如chmod u+rwx /Users/my_folder。

内容的提问来源于stack exchange,提问作者MatGut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:33:43