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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:48:19