因为python脚本可以直接用文本工具打开修改,所以没有设置参数。使用的时候直接修改掉main中的连接下载参数即可。
修改一下,可以用来备份网站上的图片,数据库什么的。
#!/usr/bin/python
#coding=gbk
'''
ftp自动下载、自动上传脚本,可以递归目录操作
'''
from ftplib import FTP
import os,sys,string,datetime,time
import socket
class MYFTP:
def __init__(self, hostaddr, username, password, remotedir, port=21):
self.hostaddr = hostaddr
self.username = username
self.password = password
self.remotedir = remotedir
self.port = port
self.ftp = FTP()
self.file_list = []
# self.ftp.set_debuglevel(2)
def __del__(self):
self.ftp.close()
# self.ftp.set_debuglevel(0)
def login(self):
ftp = self.ftp
try:
timeout = 60
socket.setdefaulttimeout(timeout)
ftp.set_pasv(True)
print '开始连接到 %s' %(self.hostaddr)
ftp.connect(self.hostaddr, self.port)
print '成功连接到 %s' %(self.hostaddr)
print '开始登录到 %s' %(self.hostaddr)
ftp.login(self.username, self.password)
print '成功登录到 %s' %(self.hostaddr)
debug_print(ftp.getwelcome())
except Exception:
deal_error("连接或登录失败")
try:
ftp.cwd(self.remotedir)
except(Exception):
deal_error('切换目录失败')
def is_same_size(self, localfile, remotefile):
try:
remotefile_size = self.ftp.size(remotefile)
except:
remotefile_size = -1
try:
localfile_size = os.path.getsize(localfile)
except:
localfile_size = -1
debug_print('lo:%d re:%d' %(localfile_size, remotefile_size),)
if remotefile_size == localfile_size:
return 1
else:
return 0
def download_file(self, localfile, remotefile):
if self.is_same_size(localfile, remotefile):
debug_print('%s 文件大小相同,无需下载' %localfile)
return
else:
debug_print('>>>>>>>>>>>>下载文件 %s ... ...' %localfile)
#return
file_handler = open(localfile, 'wb')
self.ftp.retrbinary('RETR %s'%(remotefile), file_handler.write)
file_handler.close()
def download_files(self, localdir='./', remotedir='./'):
try:
self.ftp.cwd(remotedir)
except:
debug_print('目录%s不存在,继续...' %remotedir)
return
if not os.path.isdir(localdir):
os.makedirs(localdir)
debug_print('切换至目录 %s' %self.ftp.pwd())
self.file_list = []
self.ftp.dir(self.get_file_list)
remotenames = self.file_list
#print(remotenames)
#return
for item in remotenames:
filetype = item[0]
filename = item[1]
local = os.path.join(localdir, filename)
if filetype == 'd':
self.download_files(local, filename)
elif filetype == '-':
self.download_file(local, filename)
self.ftp.cwd('..')
debug_print('返回上层目录 %s' %self.ftp.pwd())
def upload_file(self, localfile, remotefile):
if not os.path.isfile(localfile):
return
if self.is_same_size(localfile, remotefile):
debug_print('跳过[相等]: %s' %localfile)
return
file_handler = open(localfile, 'rb')
self.ftp.storbinary('STOR %s' %remotefile, file_handler)
file_handler.close()
debug_print('已传送: %s' %localfile)
def upload_files(self, localdir='./', remotedir = './'):
if not os.path.isdir(localdir):
return
localnames = os.listdir(localdir)
self.ftp.cwd(remotedir)
for item in localnames:
src = os.path.join(localdir, item)
if os.path.isdir(src):
try:
self.ftp.mkd(item)
except:
debug_print('目录已存在 %s' %item)
self.upload_files(src, item)
else:
self.upload_file(src, item)
self.ftp.cwd('..')
def get_file_list(self, line):
ret_arr = []
file_arr = self.get_filename(line)
if file_arr[1] not in ['.', '..']:
self.file_list.append(file_arr)
def get_filename(self, line):
pos = line.rfind(':')
while(line[pos] != ' '):
pos += 1
while(line[pos] == ' '):
pos += 1
file_arr = [line[0], line[pos:]]
return file_arr
def debug_print(s):
print (s)
def deal_error(e):
timenow = time.localtime()
datenow = time.strftime('%Y-%m-%d', timenow)
logstr = '%s 发生错误: %s' %(datenow, e)
debug_print(logstr)
file.write(logstr)
sys.exit()
if __name__ == '__main__':
file = open("log.txt", "a")
timenow = time.localtime()
datenow = time.strftime('%Y-%m-%d', timenow)
logstr = datenow
# 配置如下变量
hostaddr = 'localhost' # ftp地址
username = 'test' # 用户名
password = 'test' # 密码
port = 21 # 端口号
rootdir_local = '.' + os.sep + 'bak/' # 本地目录
rootdir_remote = './' # 远程目录
f = MYFTP(hostaddr, username, password, rootdir_remote, port)
f.login()
f.download_files(rootdir_local, rootdir_remote)
timenow = time.localtime()
datenow = time.strftime('%Y-%m-%d', timenow)
logstr += " - %s 成功执行了备份\n" %datenow
debug_print(logstr)
file.write(logstr)
file.close()
分享到:
相关推荐
python写的FTP下载工具 支持递归下载
本文介绍了一个 Python 实现 FTP 上传文件或文件夹的实例,通过定义类和方法的方式,实现了 FTP 服务器的连接、文件上传以及文件夹的递归上传等功能。这对于需要自动化上传文件或文件夹的场景非常有用。此外,还介绍...
支持上传,下载ftp的文件,备份,递归。
总之,FTPdown是一个利用Python的`ftplib`库实现的FTP递归下载工具,它能够自动化下载FTP服务器上的目录及其所有子目录,提高了处理大量FTP文件的效率,并且具有一定的错误处理和定制化能力。通过理解和使用这样的...
本文实例为大家分享了python实现FTP循环上传文件的具体代码,供大家参考,具体内容如下 测试过程中,有时会用到FTP的数据流,...class Transmitter(object): # 注意:递归上传本地文件或dirs到ftp服务器 def __init__
要支持目录下载,你需要修改 `ftp_download` 函数,使其能够递归地创建本地目录并下载所有文件,类似于 `ftp_upload` 函数中的 `__ftp_upload` 辅助函数。 此外,为了安全起见,建议使用环境变量或配置文件来存储...
总的来说,多线程实现的FTP客户端程序通过并行处理多个任务,提高了文件操作的效率,提供了更高效的文件传输体验。在实际开发过程中,需要兼顾性能优化、线程安全和用户体验,确保程序的稳定性和可靠性。
FTP递归下载是指从FTP服务器上获取目录及其所有子目录中的所有文件和子目录的过程。这通常通过FTP客户端软件实现,如`lftp`或`WinSCP`,它们支持递归模式来下载整个目录结构。在Python中,可以使用`ftplib`模块实现...
另外,还给出了一个扩展的实例,该实例支持递归目录操作,适用于批量下载或上传文件。 在实际应用中,你需要将`'host'`、`'username'`、`'pwd'`以及文件路径等替换为实际的FTP服务器信息和文件路径。这个例子提供了...
Python 实现从FTP服务器下载文件是一项常见的任务,尤其在数据迁移、备份或者远程协作中非常有用。以下将详细讲解如何使用Python的`ftplib`模块来实现这一功能,并结合给出的代码片段进行解析。 首先,我们需要导入...
为了实现更高级的功能,例如列出服务器上的所有文件或递归下载整个目录,我们可以使用`NLST`命令获取目录列表,然后遍历列表进行操作。另外,如果服务器支持,可以使用`MLSD`命令获取更详细的文件信息。 总的来说,...
Python FTP库提供了对FTP(File Transfer Protocol)服务器的访问,使得在Python程序中进行文件的下载、删除和上传变得十分便捷。以下是对标题和描述中所述知识点的详细说明: 1. **FTP链接**: 在Python中,我们...
总之,Python的`ftplib`模块提供了丰富的功能来处理FTP通信,结合文件系统操作,可以轻松实现文件夹的同步,无论是本地还是远程FTP服务器。在开发这样的工具时,确保代码的健壮性和效率是非常重要的,以适应不同的...
该资源为python实现可配置的sftp传输,get和put 配置文件为.ini文件;put和get区分一下源和目的路径,基本配置项即说明如下: [ftp]:ftp基本信息 [common] 公共的配置 如日志信息,传输模式,是否递归,是否删除等 ...
通过Python的`ftplib`模块,我们可以方便地实现FTP客户端的功能,包括上传、下载、列出目录内容以及管理远程文件等。本篇文章主要讲解如何使用Python的`ftplib`模块上传文件到Linux服务器。 首先,我们需要导入`...
6. 上传文件和子文件夹:对每个文件执行PUT操作,对每个子文件夹执行MKD(Make Directory)操作,然后递归上传子文件夹内容。 二、断点续传 断点续传是在上传或下载过程中,如果因网络问题或其他原因中断,可以从...
3. **递归操作**:ftputil支持递归地处理目录,比如遍历整个远程目录树,这对于文件同步或批量操作非常有用。 4. **错误处理和异常**:ftputil封装了FTP错误,将其转化为Python异常,如`ftputil.error.FTPError`,...