Python利用ftplib库实现ftp文件传输自动化全攻略
Python标准库ftplib可实现FTP文件传输自动化,涵盖连接登录、目录操作、文件上传下载及管理。支持FTPS加密传输,提供二进制和文本模式,可设置缓冲区优化大文件传输。实战案例包括自动备份与定时下载日志,提升运维效率。
在日常工作中,FTP文件传输是绕不开的活计。上传、下载、备份,几乎每天都要打交道。如果全靠手动操作,既繁琐又容易出错。实际上,Python标准库里的ftplib就能帮我们把这些流程自动化起来。下面就来梳理一下,如何用这个库把FTP任务做得干净利落。
01 ftplib库核心函数速查表
1️⃣ 连接与登录
#非加密传输 from ftplib import FTP # 创建FTP对象 ftp = FTP() # 连接服务器,ftp默认端口为21 ftp.connect(host='168.0.0.1', port=21) # 登录认证,输入正确的用户名和密码 ftp.login(user='your_username', passwd='your_password') # 操作完成后,安全退出连接 ftp.quit() #使用FTPS加密连接,加密传输,防止数据泄露。 from ftplib import FTP_TLS ftps = FTP_TLS('secure.example.com') ftps.login(user='admin', passwd='secret') ftps.prot_p() # 启用加密数据通道
这里需要留意几点:FTP()创建对象后,connect方法负责指定服务器地址和端口;login方法则是输入用户名和密码完成认证。操作结束后,记得用quit方法关闭连接,避免资源浪费。如果数据敏感,建议使用FTPS加密通道。
2️⃣ 目录操作
# 获取当前所在目录
current_dir = ftp.pwd()
print(f"当前目录: {current_dir}")
# 切换到目标目录
ftp.cwd('/remote/files')
# 在服务器上创建新目录
ftp.mkd('new_folder')
# 删除空目录,注意目录必须为空才能删除成功
ftp.rmd('old_folder')
说白了,就是一套标准的目录操作命令行:pwd看当前路径,cwd切换目录,mkd创建文件夹,rmd删除空目录。掌握这几个,基本就能在服务器目录间自如穿梭了。
3️⃣ 文件上传下载
1)上传文件
# 以二进制模式上传文件,适用于图片、压缩包等非文本文件
with open('local_file.zip', 'rb') as f:
ftp.storbinary('STOR remote_file.zip', f)
# 以ASCII模式上传文本文件,如txt,log,html,xml等,保证文本格式正确
with open('readme.txt', 'r') as f:
ftp.storlines('STOR readme.txt', f)
注意这里的'STOR remote_file.zip',STOR是固定写法,后面跟的是服务器上要保存的文件名。二进制模式适合图片、压缩包这类非文本文件,ASCII模式则专门处理txt、log、html等文本文件,能保证换行符的正确转换。
2)下载文件
# 以二进制模式下载文件,将服务器文件保存到本地 with open('local.zip', 'wb') as f: ftp.retrbinary('RETR remote.zip', f.write) #传输大文件时,合理设置缓冲区大小能提升传输效率: # 设置缓冲区大小为1MB,可根据实际情况调整 BUFFER_SIZE = 1024 * 1024 # 使用设置好的缓冲区大小下载大文件 with open('large_file.iso', 'wb') as f: ftp.retrbinary('RETR large_file.iso', f.write, blocksize=BUFFER_SIZE) # 以文本模式下载文件,将服务器文件保存到本地 with open('local.txt', 'wb') as f: ftp.retrlines('RETR remote.txt', f.write)
二进制下载用retrbinary,文本下载用retrlines。如果下载大文件,设置blocksize参数能明显提升效率,比如1MB的缓冲区就是个不错的起点。
实际使用中,下载文本文件时偶尔会遇到换行符转换失败的问题,多行文本下载后变成了一行。解决方案其实很简单:自己写一个回调函数,在每一行末尾加上换行符。
def write(line): f.write(line + '\n') # 以文本模式下载文件,将服务器文件保存到本地 回调函数为自己定义的write函数 with open('local.txt', 'wb') as f: ftp.retrlines('RETR remote.txt', write)
4️⃣ 文件管理
对服务器上的文件进行管理,这几个函数基本能满足日常需求:
# 删除远程服务器上的指定文件 ftp.delete('obsolete_file.txt') # 重命名文件,方便文件整理 ftp.rename('old_name.txt', 'new_name.txt') # 获取文件大小,了解文件占用空间 size = ftp.size('large_file.iso') print(f"文件大小: {size} 字节")
5️⃣ 目录列表
查看服务器目录内容,可以用下面几种方式快速获取文件信息:
# 获取简洁的文件列表
files = ftp.nlst()
print("目录内容:", files)
# 获取详细文件列表,直接打印到控制台
ftp.dir()
# 解析详细列表,获取文件名和类型
ftp.mlsd()
6️⃣ 其他操作
# 设置编码
ftp.encoding = 'utf-8'
# 设置传输模式
ftp.set_pasv(True) # 被动模式(推荐)
# 发送自定义命令
response = ftp.sendcmd('HELP') # 获取服务器支持的命令
print("服务器支持命令:", response)
# 获取文件修改时间
mod_time = ftp.sendcmd('MDTM config.ini')
print(f"最后修改时间: {mod_time[4:]}")
# 设置超时时间
ftp = FTP(timeout=30)
# 异常处理示例,出现登录失败等问题时可添加重试逻辑
try:
ftp.login(user, passwd)
except ftplib.error_temp as e:
print(f"登录失败: {e}")
这些辅助功能很实用:编码设置能避免中文乱码,被动模式是大多数网络环境下的推荐选择,超时时间设置能防止程序卡住,异常处理则让自动化脚本更健壮。
02实战案例
案例 1:自动备份数据到FTP
import os
from datetime import datetime
from ftplib import FTP
def backup_site(local_dir, ftp_dir):
# 创建带时间戳的备份目录,方便区分不同时间的备份
timestamp = datetime.now().strftime("%Y%m%d_%H%M")
backup_dir = f"{ftp_dir}/backup_{timestamp}"
ftp = FTP('host地址')
ftp.login('user', 'password')
# 在服务器上创建备份目录
ftp.mkd(backup_dir)
ftp.cwd(backup_dir)
# 遍历本地目录,上传所有文件
for file in os.listdir(local_dir):
local_path = os.path.join(local_dir, file)
if os.path.isfile(local_path):
with open(local_path, 'rb') as f:
ftp.storbinary(f'STOR {file}', f)
print(f"备份完成至: {backup_dir}")
ftp.quit()
backup_site('dir1', '/dir2')
这个脚本非常适合定期备份网站或项目文件。每次备份都会生成一个带时间戳的目录,方便后续查找和恢复。
案例 2:定时下载日志文件
自动获取服务器日志,便于后续分析和排查问题:
import schedule
import time
from ftplib import FTP
def download_logs():
ftp = FTP('host地址')
ftp.login('user', 'password')
ftp.cwd('/logs')
# 只下载今日日志,精准获取所需数据
today = time.strftime("%Y%m%d")
for file in ftp.nlst():
if today in file:
with open(file, 'wb') as f:
ftp.retrbinary(f'RETR {file}', f.write)
ftp.quit()
# 设置每天凌晨00:05执行下载任务
schedule.every().day.at("00:05").do(download_logs)
while True:
schedule.run_pending()
time.sleep(60)
这个案例结合了schedule库实现定时任务,每天凌晨自动拉取当天的日志文件。既保证了数据及时性,又省去了手动操作的麻烦。
WPS Office是一款面向macOS用户的综合办公套件,将文字处理、电子表格、演示文稿、PDF工具、模板与云协作整合在同一应用中。它兼容常见Microsoft Office格式,支持Intel及Apple芯片Mac,基础功能可免费使用,
Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。
REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。
Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理工具,可在 Windows 上完成照片修饰、选区抠图、图层合成、文字排版、绘画及生成式编辑。软件采用订阅授权,由 Creative Cloud 管理安装、更新与许
Adobe InDesign 是面向印刷与数字出版的专业页面排版工具,可制作书籍、杂志、宣传册、海报、交互式 PDF 和电子书。它提供精细的文字样式、多页面管理、印前检查及多格式输出能力,并能与 Photoshop、Illustrator
Adobe Illustrator 是用于绘制矢量图形、插画、图标、徽标和版式的专业设计工具。它以路径和锚点为核心,作品放大后仍能保持清晰,并提供画板、文字、渐变、图像描摹及精确变换等功能,适合品牌视觉、印刷物料、数字界面和商业插画创作。













