如何用Python在Jupyter Notebook中遍历子链接并获取指定文件
解决FTP目录遍历与目标文件下载问题
你的问题出在误用了pd.read_table——这个函数是用来读取结构化表格数据的,根本没法解析FTP服务器返回的目录列表,自然实现不了逐层遍历的需求。要处理FTP目录的遍历和文件下载,应该用Python标准库ftplib,下面是可行的实现方案:
直接定位下载目标文件的代码
from ftplib import FTP # 目标文件在FTP服务器上的路径 ftp_file_path = 'pride/data/archive/2015/05/PXD000790/sdrf.tsv' # 本地保存文件的路径 local_save_path = './sdrf.tsv' # 连接FTP服务器,支持匿名登录 ftp = FTP('ftp.pride.ebi.ac.uk') ftp.login() try: # 切换到目标文件所在的目录 ftp.cwd('/'.join(ftp_file_path.split('/')[:-1])) # 以二进制模式下载文件,避免编码问题 with open(local_save_path, 'wb') as local_file: ftp.retrbinary(f'RETR {ftp_file_path.split("/")[-1]}', local_file.write) print(f"文件已成功保存到 {local_save_path}") finally: # 无论是否出错,都关闭FTP连接 ftp.quit()
代码关键说明
FTP('ftp.pride.ebi.ac.uk'):建立与目标FTP服务器的连接ftp.login():该服务器支持匿名访问,无需账号密码直接调用即可登录ftp.cwd():切换到目标文件所在的上级目录ftp.retrbinary():用二进制模式下载文件,保证文件内容完整不损坏
动态遍历目录查找目标文件的扩展代码
如果需要自动遍历目录查找所有sdrf.tsv文件,可以用递归遍历的方式:
from ftplib import FTP def search_target_file(ftp, current_dir, target_filename): # 获取当前目录下的所有条目 entries = [] ftp.dir(lambda line: entries.append(line.split()[-1])) for entry in entries: try: # 尝试进入子目录 ftp.cwd(f"{current_dir}/{entry}") # 递归查找 found_path = search_target_file(ftp, f"{current_dir}/{entry}", target_filename) if found_path: return found_path # 回到上级目录 ftp.cwd('..') except: # 不是目录则检查是否是目标文件 if entry == target_filename: return f"{current_dir}/{entry}" return None # 使用示例 ftp = FTP('ftp.pride.ebi.ac.uk') ftp.login() target_file = search_target_file(ftp, 'pride/data/archive', 'sdrf.tsv') if target_file: print(f"找到目标文件:{target_file}") # 可在此添加下载逻辑 ftp.quit()
内容的提问来源于stack exchange,提问作者Hemant Srivastava
相关产品推荐
相关产品推荐

