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

Python 3.8 Spyder环境下ftputil导入失败无法实现FTP文件删除

替代ftputil实现FTP过期文件删除的可行方案

选型依据

优先选用Python 3.8内置标准库ftplib,属于Python原生预装模块,无需额外执行pip安装操作,可彻底规避第三方模块导入失败的问题,完全覆盖所需的FTP连接、目录切换、文件列表获取、修改时间读取、过期文件删除全流程能力。

适配原有业务逻辑的实现代码

#! /usr/bin/python
import time
from ftplib import FTP

# 替换为实际的FTP连接参数
ftp_host = 'host'
ftp_user = 'username'
ftp_pass = 'password'
target_dir = 'ftp_dir'
# 过期阈值:单位秒,此处代表修改时间早于1小时前的文件将被删除
expire_seconds = 3600

# 建立FTP连接
ftp = FTP(ftp_host)
ftp.login(ftp_user, ftp_pass)
now = time.time()

# 切换到目标目录
ftp.cwd(target_dir)
# 获取当前目录下所有文件名列表
file_names = ftp.nlst()

for name in file_names:
    # 跳过当前目录/上级目录特殊标识
    if name in ('.', '..'):
        continue
    # 校验是否为普通文件,排除目录
    try:
        # 用MLST命令获取路径属性,Type=file代表是普通文件
        mlst_resp = ftp.sendcmd(f'MLST {name}')
        is_file = 'Type=file' in mlst_resp
    except:
        # 部分老旧FTP服务不支持MLST,通过尝试切换目录校验,若抛异常则为文件
        try:
            ftp.cwd(name)
            ftp.cwd('..')
            continue
        except:
            is_file = True
    if not is_file:
        continue
    # 获取文件修改时间,通过MDTM命令直接读取
    mdtm_resp = ftp.sendcmd(f'MDTM {name}')
    # 解析MDTM返回的时间:格式为 213 YYYYMMDDHHMMSS
    mdtm_str = mdtm_resp.split()[1]
    # 转换为本地时间戳
    mtime = time.mktime(time.strptime(mdtm_str, '%Y%m%d%H%M%S'))
    # 判定是否过期
    if mtime < (now - expire_seconds):
        ftp.delete(name)

# 正常关闭FTP连接
ftp.quit()

关键说明

  • 代码完全对齐原有业务逻辑:仅删除目标目录下、修改时间早于1小时的普通文件,不会误删目录
  • 兼容老旧FTP服务:针对不支持MLST命令的FTP服务器,增加了目录判定的兜底逻辑
  • 无额外依赖:所有功能基于Python原生库实现,不会触发ModuleNotFoundError类报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 19:24:03