如何用Python从FTP下载文件名含指定日期的文件并跳过缺失项
Python FTP按日期批量下载漫画实现方案
1. 符合命名规则的文件名拼接方法
不需要手动拆分拼接日期字符串,直接使用datetime对象的strftime方法按指定格式输出日期段即可:
- 两位短年份用格式符
%y - 两位补零月份用格式符
%m - 两位补零日期用格式符
%d
文件名生成代码写法:
from datetime import datetime, timedelta # 以当日为基准,生成未来7天(含当日)的日期对象 base_date = datetime.today() for offset in range(7): target_date = base_date + timedelta(days=offset) # 直接拼接为ba[yymmdd].tif格式的文件名 file_name = f"ba{target_date.strftime('%y%m%d')}.tif"
注意:不要把
%y误写为%Y,后者会输出4位完整年份,不符合仓库命名规则。
2. 缺失文件自动跳过的实现
不要给整个下载循环加外层异常捕获,要把单个文件的下载逻辑放在独立的try-except块中,精准捕获FTP返回的文件不存在错误即可:
- FTP协议中返回状态码
550代表请求的文件不存在/不可访问,对应ftplib库抛出的error_perm异常 - 捕获到550错误时打印提示信息,执行
continue直接进入下一个文件的下载流程 - 非550类的错误(如网络中断、权限不足)不要拦截,正常抛出方便排查问题
完整参考代码
from datetime import datetime, timedelta from ftplib import FTP, error_perm # --- 已完成的FTP登录逻辑-start --- ftp = FTP() ftp.connect("你的FTP地址", port=21) ftp.login(user="你的用户名", passwd="你的密码") ftp.cwd("漫画文件所在的FTP目录") # --- 已完成的FTP登录逻辑-end --- base_date = datetime.today() for day_offset in range(7): current_date = base_date + timedelta(days=day_offset) filename = f"ba{current_date.strftime('%y%m%d')}.tif" try: # 执行文件下载 with open(filename, "wb") as local_file: ftp.retrbinary(f"RETR {filename}", local_file.write) print(f"成功下载:{filename}") except error_perm as e: # 识别文件不存在错误并跳过 if str(e).startswith("550"): print(f"缺失文件:{filename},已跳过") continue # 其余FTP错误正常抛出 raise # 任务结束后关闭FTP连接 ftp.quit()
内容的提问来源于stack exchange,提问作者schnarkle
相关产品推荐
相关产品推荐

