暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

FTP下载多层目录子文件

IT运维大爆炸 2023-03-07
1140

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论