Python实现FTP服务器当日文件下载:仅获取今日新增文件求助
实现从FTP多文件夹下载当日新增文件
修改后的完整代码
import ftplib import os from datetime import datetime # 配置信息 FTP_SERVER = 'ftpserver.com' FTP_USER = 'user_ftp' FTP_PASS = 'ftp_pass' # 要遍历的5个FTP文件夹 FTP_FOLDERS = ['/test/123', '/test/456', '/test/789', '/test/abc', '/test/def'] # 本地保存根目录 LOCAL_ROOT = 'C:\\test' # 创建本地根目录(如果不存在) os.makedirs(LOCAL_ROOT, exist_ok=True) try: ftp = ftplib.FTP(FTP_SERVER) ftp.login(FTP_USER, FTP_PASS) ftp.encoding = 'utf-8' # 处理中文文件名 # 获取当日日期(格式:YYYYMMDD) today = datetime.today().strftime('%Y%m%d') for folder in FTP_FOLDERS: try: ftp.cwd(folder) print(f"正在处理FTP文件夹: {folder}") except ftplib.error_perm: print(f"无法访问FTP文件夹: {folder},跳过") continue # 获取当前文件夹下的文件列表(排除子文件夹) file_list = [] ftp.dir(lambda x: file_list.append(x)) # 解析dir输出,提取文件名和修改时间 for line in file_list: # 拆分dir输出的字段,格式示例:-rw-r--r-- 1 user group 1234 May 20 10:30 filename.txt parts = line.split() if len(parts) < 9: continue # 跳过非文件条目(比如子文件夹) # 提取修改时间部分 month, day, time_or_year = parts[5], parts[6], parts[7] # 处理年份:如果是时间(包含冒号),则用当前年份;否则直接用年份 if ':' in time_or_year: file_year = str(datetime.today().year) else: file_year = time_or_year # 拼接日期字符串,转换为YYYYMMDD格式 file_date_str = f"{file_year}{datetime.strptime(month, '%b').month:02d}{int(day):02d}" filename = ' '.join(parts[8:]) # 文件名可能包含空格 # 判断是否为当日文件 if file_date_str != today: continue # 构造本地保存路径 local_folder = os.path.join(LOCAL_ROOT, folder.lstrip('/').replace('/', '\\')) os.makedirs(local_folder, exist_ok=True) local_file_path = os.path.join(local_folder, filename) # 检查本地是否已存在该文件,不存在则下载 if not os.path.exists(local_file_path): try: with open(local_file_path, 'wb') as local_file: ftp.retrbinary(f'RETR {filename}', local_file.write) print(f"已下载: {filename}") except ftplib.error_perm: print(f"无法下载文件: {filename},跳过") else: print(f"本地已存在: {filename},跳过") # 切回FTP根目录,避免后续文件夹切换出错 ftp.cwd('/') except ftplib.all_errors as e: print(f"FTP连接或操作出错: {str(e)}") finally: if 'ftp' in locals(): ftp.quit()
关键改动说明
- 多文件夹遍历:通过
FTP_FOLDERS列表定义要处理的5个FTP目录,循环切换目录逐个处理,避免重复写冗余代码。 - 当日文件判断:解析FTP的
dir命令输出,提取文件的修改日期,转换为YYYYMMDD格式后和当日日期对比,只处理匹配的文件。 - 本地路径自动创建:根据FTP文件夹结构自动创建对应的本地目录,确保文件保存路径合法。
- 重复下载避免:先检查本地是否已存在目标文件,不存在才执行下载操作,符合“无需删除文件”的需求。
- 异常处理优化:增加了文件夹访问失败、文件下载失败等场景的异常捕获,避免程序中途崩溃。
内容的提问来源于stack exchange,提问作者Lem L
相关产品推荐
相关产品推荐

