使用 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()
说明
-
connect_ftp: 连接到 FTP 服务器。
-
move_files: 将文件从源目录移动到目标目录。具体步骤如下:
- 切换到源目录。
- 获取目录中的文件列表。
- 下载每个文件到本地临时目录(
/tmp
)。 - 切换到目标目录。
- 上传文件到目标目录。
- 返回源目录,删除源文件。
- 删除本地临时文件。
-
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 上使用任务计划程序
- 打开任务计划程序,创建一个基本任务。
- 设置触发器,例如每天在下班后运行。
- 动作选择“启动程序”,浏览到 Python 解释器,例如
python.exe
。 - 在“添加参数”字段中,输入脚本路径,例如
C:\path\to\your_script.py
。 - 完成任务创建。
在 Linux 上使用 cron
- 打开终端,运行
crontab -e
编辑 cron 表。 - 添加一行,设置脚本的调度。例如,每天晚上 6 点运行:
0 18 * * * /usr/bin/python3 /path/to/your_script.py
- 保存并退出。
总结
通过上述步骤,你可以编写一个 Python 脚本,使用 FTP 协议自动移动文件,并使用调度工具在下班后自动运行该脚本。确保测试脚本并验证其在你的环境中正常工作,以确保自动化过程顺利进行。
二、在 Windows 上使用任务计划程序设置每天晚上6点自动执行Python脚本
在 Windows 上使用任务计划程序设置每天晚上6点自动执行Python脚本,可以按照以下步骤操作:
步骤 1:准备 Python 脚本
确保你已经编写好需要定时运行的 Python 脚本,例如 ftp_move_files.py
。将这个脚本放在一个合适的位置,例如 C:\path\to\your_script.py
。
步骤 2:打开任务计划程序
- 按
Win + R
打开运行窗口,输入taskschd.msc
并按 Enter 键,打开任务计划程序。
步骤 3:创建基本任务
- 在任务计划程序的左侧窗格中,选择“任务计划程序库”。
- 在右侧窗格中,点击“创建基本任务”。
步骤 4:配置任务名称和描述
- 在“创建基本任务向导”窗口中,为任务命名,例如“自动运行Python脚本”。
- 可以在描述字段中添加任务的简要描述,点击“下一步”。
步骤 5:设置任务触发器
- 在“任务触发器”页面,选择“每天”,然后点击“下一步”。
步骤 6:设置每日触发时间
- 在“每日”页面,设置开始时间为 18:00(即晚上6点)。
- 确保“每天”设置为“1”,表示每天运行一次。
- 点击“下一步”。
步骤 7:选择任务操作
- 在“操作”页面,选择“启动程序”,然后点击“下一步”。
步骤 8:配置启动程序
-
在“启动程序”页面,点击“浏览”按钮,找到并选择 Python 解释器
python.exe
。Python 解释器通常位于以下路径之一:C:\Python39\python.exe
(Python 3.9 版本)- 或者其他你安装 Python 的路径。
-
在“添加参数(可选)”字段中,输入脚本的完整路径,例如:
C:\path\to\your_script.py
-
在“起始于(可选)”字段中,输入脚本所在的目录路径,例如:
C:\path\to\
-
点击“下一步”。
步骤 9:完成任务创建
- 在“总结”页面,检查所有设置是否正确,然后点击“完成”。
确认任务配置
- 在任务计划程序的“任务计划程序库”中,找到刚创建的任务,右键点击任务,选择“运行”,以手动测试任务是否能正常运行。
- 检查任务是否在预期时间自动执行,并验证 Python 脚本的执行结果。
示例
假设你的 Python 脚本路径为 C:\path\to\your_script.py
,Python 解释器路径为 C:\Python39\python.exe
,配置“启动程序”步骤如下:
-
程序/脚本:
C:\Python39\python.exe
-
添加参数(可选):
C:\path\to\your_script.py
-
起始于(可选):
C:\path\to\
总结
通过任务计划程序,你可以方便地设置和管理定时任务。按照上述步骤配置后,任务计划程序将每天晚上6点自动执行指定的 Python 脚本,确保你的 FTP 操作按时进行。