1、简介
最近在做一个稽核任务,需要FTP登录服务器下载文件到本地U盘,参考了不少例子,功能都太单一,很少能直接拿来使用,于是自己写了一个。
2、常用模块
# 登录
ftp = FTP() #设置变量
ftp.set_debuglevel(2) #打开调试级别2 显示详细信息
ftp.connect("IP", "port") #连接ftp, IP和端口
ftp.log("user", "password") #连接的用户名、密码
# 操作文件
ftp.cwd(pathname) #设置FTP当前操作的路径
ftp.dir() #显示目录下的文件信息
ftp.nlst() #获取目录下的文件
ftp.mkd(pathname) #新建远程目录
ftp.pwd() #返回当前所在位置
ftp.rmd(dirname) #删除远程目录
ftp.delete(filename) #删除远程文件
ftp.rename(from_name, to_name) #修改文件名
ftp.storbinaly("STOR filename.txt", file_handel, bufsize) # 上传目标文件
ftp.retrbinaly("RETR filename.txt", file_handel, bufsize) # 上传FTP文件
ftp.size(filename) # 返回服务器中的文件大小
3、优点
可以下载ftp目录里面多级子目录的文件。
本地目录会自动创建。
保证数据不重复,检查本地文件是否存在,如果存在则跳过下载。
可重复执行,不影响之前数据。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import ftplib
import os
import hashlib
# 递归函数,下载FTP目录下的所有文件
def download_ftp_files(ftp, ftp_path, local_path):
# 切换到FTP目录
ftp.cwd(ftp_path)
# 遍历目录下的所有文件
for item in ftp.nlst():
# 如果是一个目录,则递归下载目录下的文件
if "." not in item:
sub_local_path = os.path.join(local_path, item)
os.makedirs(sub_local_path, exist_ok=True)
download_ftp_files(ftp, ftp_path + "/" + item, sub_local_path)
# 如果是一个文件,则下载文件
else:
local_file_path = os.path.join(local_path, item)
# 如果本地已经存在该文件,则跳过
if os.path.exists(local_file_path):
print(f"{local_file_path} already exists, skipped")
continue
# 下载文件
with open(local_file_path, "wb") as f:
ftp.retrbinary(f"RETR {item}", f.write)
print(f"Downloaded {local_file_path} successfully")
# FTP服务器的连接信息
ftp_host = "xx.xx.xx.xx"
ftp_user = "ftpuser"
ftp_password = "XXXX"
# 要下载的FTP目录
ftp_path = r'\DvsVoice' # windows目录
local_path = "/mnt/test/"
# 连接FTP服务器
ftp = ftplib.FTP(ftp_host)
ftp.login(user=ftp_user, passwd=ftp_password)
# 下载FTP目录下的所有文件
download_ftp_files(ftp, ftp_path, local_path)
# 断开连接
ftp.quit()


4、运行效果
[root@jenkins tmp]# python3 main.py
/mnt/test/20210101/07/07021332684775.voc already exists, skipped
/mnt/test/20210101/07/07042322684776.voc already exists, skipped
/mnt/test/20210101/07/07070644784777.voc already exists, skipped
/mnt/test/20210101/07/07104621484778.voc already exists, skipped
/mnt/test/20210101/07/07153856884779.voc already exists, skipped
/mnt/test/20210101/07/07180833084780.voc already exists, skipped
/mnt/test/20210101/07/07222256884781.voc already exists, skipped
Downloaded mnt/test/20210101/07/07273050184782.voc successfully
Downloaded /mnt/test/20210101/07/07280000284783.voc successfully
Downloaded /mnt/test/20210101/07/07290369284784.voc successfully

欢迎大家扫码关注:

本公众号只写原创,不接广告、不接广告、不接广告。下期小伙伴想学习什么技术,可以私信发我吆。

文章转载自IT运维大爆炸,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




