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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:40:14