【Python-因特网客户端编程-05】如何使用 Python连接到 FTP 服务器每天下班后自动移动文件

一、使用 Python连接到 FTP 服务器自动移动文件

你可以使用 Python 编写一个脚本,利用 ftplib 库连接到 FTP 服务器,自动移动文件。为了确保脚本在你下班后自动运行,可以使用调度工具,例如 Windows 的任务计划程序或 Linux 的 cron 作业。

以下是一个使用 Python 编写的示例脚本,它会连接到 FTP 服务器,并将文件从一个目录移动到另一个目录。

示例 Python 脚本

首先,确保你已经安装了 ftplib 库(标准库,无需安装)和 shutil 库(标准库,无需安装)。

from ftplib import FTP
import os
import shutil
from datetime import datetime

def connect_ftp(host, username, password):
    ftp = FTP(host)
    ftp.login(user=username, passwd=password)
    return ftp

def move_files(ftp, src_dir, dest_dir):
    ftp.cwd(src_dir)
    files = ftp.nlst()
    for file in files:
        try:
            local_file = os.path.join("/tmp", file)
            with open(local_file, 'wb') as f:
                ftp.retrbinary('RETR ' + file, f.write)
            
            ftp.cwd(dest_dir)
            with open(local_file, 'rb') as f:
                ftp.storbinary('STOR ' + file, f)
            
            ftp.cwd(src_dir)
            ftp.delete(file)
            os.remove(local_file)
            print(f"Moved file {file} from {src_dir} to {dest_dir}")
        except Exception as e:
            print(f"Failed to move file {file}: {e}")

def main():
    host = 'ftp.example.com'
    username = 'yourusername'
    password = 'yourpassword'
    src_dir = '/source_directory'
    dest_dir = '/destination_directory'

    ftp = connect_ftp(host, username, password)
    move_files(ftp, src_dir, dest_dir)
    ftp.quit()

if __name__ == "__main__":
    main()

说明

  1. connect_ftp: 连接到 FTP 服务器。

  2. move_files: 将文件从源目录移动到目标目录。具体步骤如下:

    • 切换到源目录。
    • 获取目录中的文件列表。
    • 下载每个文件到本地临时目录(/tmp)。
    • 切换到目标目录。
    • 上传文件到目标目录。
    • 返回源目录,删除源文件。
    • 删除本地临时文件。
  3. main: 配置 FTP 服务器信息和目录路径,连接 FTP 并移动文件。
    这段代码的作用是从 FTP 服务器下载一个文件到本地临时目录 /tmp。以下是详细的解释:

     ### 代码片段
     
     ```python
     local_file = os.path.join("/tmp", file)
     with open(local_file, 'wb') as f:
         ftp.retrbinary('RETR ' + file, f.write)
     ```
     
     ### 详细解释
     
     1. **构建本地文件路径**:
        ```python
        local_file = os.path.join("/tmp", file)
        ```
        - **`os.path.join("/tmp", file)`**:将文件名 `file` 和本地目录 `/tmp` 结合起来,生成一个完整的本地文件路径。
        - 例如,如果 `file` 的值是 `example.txt`,则 `local_file` 的值将是 `/tmp/example.txt`。
     
     2. **打开本地文件进行写入**:
        ```python
        with open(local_file, 'wb') as f:
        ```
        - **`open(local_file, 'wb')`**:以二进制写入模式(`'wb'`)打开文件。二进制模式确保文件内容被原样保存,适用于非文本文件(如图像、视频)。
        - **`with` 语句**:上下文管理器,用于确保文件操作完成后正确关闭文件,即使发生错误也会自动关闭文件。
     
     3. **从 FTP 服务器下载文件**:
        ```python
        ftp.retrbinary('RETR ' + file, f.write)
        ```
        - **`ftp.retrbinary('RETR ' + file, f.write)`**:使用 `ftplib` 的 `retrbinary` 方法从 FTP 服务器下载文件。
          - **`'RETR ' + file`**:FTP 命令 `'RETR'`(Retrieve,检索)加上文件名,告诉 FTP 服务器要下载哪个文件。例如,如果 `file` 是 `example.txt`,则命令是 `'RETR example.txt'`。
          - **`f.write`**:这是一个回调函数,每当从服务器读取到一块数据时,就将其写入到本地文件 `f` 中。
     
     ### 工作流程
     
     1. **构建目标路径**:将要下载的文件名 `file` 和本地目录 `/tmp` 组合成完整的本地路径 `local_file`。
     2. **打开本地文件**:以二进制写入模式打开 `local_file`,准备接收从 FTP 服务器下载的数据。
     3. **执行下载**:使用 `ftp.retrbinary` 方法从 FTP 服务器下载文件数据,每次读取到一块数据就写入到本地文件中。
     
     ### 示例
     
     假设你要从 FTP 服务器下载一个名为 `example.txt` 的文件,并将其保存到本地的 `/tmp` 目录中。
     
     ```python
     from ftplib import FTP
     import os
     
     # FTP 连接参数
     ftp_host = 'ftp.example.com'
     ftp_user = 'username'
     ftp_pass = 'password'
     remote_file = 'example.txt'
     
     # 连接到 FTP 服务器
     ftp = FTP(ftp_host)
     ftp.login(ftp_user, ftp_pass)
     
     # 构建本地文件路径
     local_file = os.path.join("/tmp", remote_file)
     
     # 下载文件
     with open(local_file, 'wb') as f:
         ftp.retrbinary('RETR ' + remote_file, f.write)
     
     # 关闭 FTP 连接
     ftp.quit()
     
     print(f"File downloaded to: {local_file}")
     ```
     
     ### 总结
     
     这段代码的核心目的是从 FTP 服务器下载指定的文件,并将其保存到本地目录中。它通过构建文件路径、打开文件进行写入、执行 FTP 下载命令等步骤实现了这一功能。在实际使用中,你需要根据具体环境调整 FTP 服务器地址、用户名、密码、文件名和本地保存路径。
    

调度任务

在 Windows 上使用任务计划程序
  1. 打开任务计划程序,创建一个基本任务。
  2. 设置触发器,例如每天在下班后运行。
  3. 动作选择“启动程序”,浏览到 Python 解释器,例如 python.exe
  4. 在“添加参数”字段中,输入脚本路径,例如 C:\path\to\your_script.py
  5. 完成任务创建。
在 Linux 上使用 cron
  1. 打开终端,运行 crontab -e 编辑 cron 表。
  2. 添加一行,设置脚本的调度。例如,每天晚上 6 点运行:
0 18 * * * /usr/bin/python3 /path/to/your_script.py
  1. 保存并退出。

总结

通过上述步骤,你可以编写一个 Python 脚本,使用 FTP 协议自动移动文件,并使用调度工具在下班后自动运行该脚本。确保测试脚本并验证其在你的环境中正常工作,以确保自动化过程顺利进行。

二、在 Windows 上使用任务计划程序设置每天晚上6点自动执行Python脚本

在 Windows 上使用任务计划程序设置每天晚上6点自动执行Python脚本,可以按照以下步骤操作:

步骤 1:准备 Python 脚本

确保你已经编写好需要定时运行的 Python 脚本,例如 ftp_move_files.py。将这个脚本放在一个合适的位置,例如 C:\path\to\your_script.py

步骤 2:打开任务计划程序

  1. Win + R 打开运行窗口,输入 taskschd.msc 并按 Enter 键,打开任务计划程序。

步骤 3:创建基本任务

  1. 在任务计划程序的左侧窗格中,选择“任务计划程序库”。
  2. 在右侧窗格中,点击“创建基本任务”。

步骤 4:配置任务名称和描述

  1. 在“创建基本任务向导”窗口中,为任务命名,例如“自动运行Python脚本”。
  2. 可以在描述字段中添加任务的简要描述,点击“下一步”。

步骤 5:设置任务触发器

  1. 在“任务触发器”页面,选择“每天”,然后点击“下一步”。

步骤 6:设置每日触发时间

  1. 在“每日”页面,设置开始时间为 18:00(即晚上6点)。
  2. 确保“每天”设置为“1”,表示每天运行一次。
  3. 点击“下一步”。

步骤 7:选择任务操作

  1. 在“操作”页面,选择“启动程序”,然后点击“下一步”。

步骤 8:配置启动程序

  1. 在“启动程序”页面,点击“浏览”按钮,找到并选择 Python 解释器 python.exe。Python 解释器通常位于以下路径之一:

    • C:\Python39\python.exe (Python 3.9 版本)
    • 或者其他你安装 Python 的路径。
  2. 在“添加参数(可选)”字段中,输入脚本的完整路径,例如:

    C:\path\to\your_script.py
    
  3. 在“起始于(可选)”字段中,输入脚本所在的目录路径,例如:

    C:\path\to\
    
  4. 点击“下一步”。

步骤 9:完成任务创建

  1. 在“总结”页面,检查所有设置是否正确,然后点击“完成”。

确认任务配置

  1. 在任务计划程序的“任务计划程序库”中,找到刚创建的任务,右键点击任务,选择“运行”,以手动测试任务是否能正常运行。
  2. 检查任务是否在预期时间自动执行,并验证 Python 脚本的执行结果。

示例

假设你的 Python 脚本路径为 C:\path\to\your_script.py,Python 解释器路径为 C:\Python39\python.exe,配置“启动程序”步骤如下:

  1. 程序/脚本

    C:\Python39\python.exe
    
  2. 添加参数(可选)

    C:\path\to\your_script.py
    
  3. 起始于(可选)

    C:\path\to\
    

总结

通过任务计划程序,你可以方便地设置和管理定时任务。按照上述步骤配置后,任务计划程序将每天晚上6点自动执行指定的 Python 脚本,确保你的 FTP 操作按时进行。

  • 51
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿寻寻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值