使用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编号。先做这两步:
- 先把所有要下载的编号打印出来检查:
看看有没有空格、小写字母、或者长度不对的编号(比如超过4位)。print(df['Structure_(PDB)_id'].tolist()) - 在你的
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
相关产品推荐
相关产品推荐

