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
相关产品推荐
相关产品推荐

