# encoding:utf-8

from ftplib import FTP
import os
import sys

_XFER_FILE = 'FILE'
_XFER_DIR = 'DIR'

class FtpClient(object):
def __init__(self):
self.ftp = None

def __del__(self):
pass

def setFtpParams(self, ip, uname, pwd, port=21, timeout=60):
self.ip = ip
self.uname = uname
self.pwd = pwd
self.port = port
self.timeout = timeout

def initEnv(self):
if self.ftp is None:
self.ftp = FTP()
print '### connect ftp server: %s ...' % self.ip
self.ftp.connect(self.ip, self.port, self.timeout)
self.ftp.login(self.uname, self.pwd)
print self.ftp.getwelcome()
self.ftp.set_pasv(False)

def clearEnv(self):
if self.ftp:
self.ftp.close()
print '### disconnect ftp server: %s!' % self.ip
self.ftp = None

def uploadDir(self, localDir='./', remoteDir='./'):
if not os.path.isdir(localDir):
return
self.ftp.cwd(remoteDir)
for file in os.listdir(localDir):
source = os.path.join(localDir, file)
if os.path.isfile(source):
self.uploadFile(source, file)
elif os.path.isdir(source):
try:
self.ftp.mkd(file)
except:
sys.stderr.write('The dir is exists %s' % file)
self.uploadDir(source, file)
self.ftp.cwd('..')

def uploadFile(self, localPath, remotePath='./'):
if not os.path.isfile(localPath):
return
print (' upload %s to %s' % (localPath, remotePath))
self.ftp.storbinary('STOR ' + remotePath, open(localPath, 'rb'))

def __filetype(self, src):
if os.path.isfile(src):
index = src.rfind('/')
# if the src not contains /
if index == -1:
index = src.rfind('/')
return _XFER_FILE, src[index + 1:]
elif os.path.isdir(src):
return _XFER_DIR, ''

def upload(self, lacaldir, remoteDir="./"):
filetype, filename = self.__filetype(lacaldir)

self.initEnv()
if filetype == _XFER_DIR:
self.srcDir = lacaldir
self.uploadDir(self.srcDir, remoteDir)
elif filetype == _XFER_FILE:
self.uploadFile(lacaldir, filename)
self.clearEnv()

def download_file(self, localfile, remotefile):

self.debug_print('>>>>>>>>>>>>下载文件 %s ... ...' % localfile)
# return
with open(localfile, 'wb') as f:
self.ftp.retrbinary('RETR %s' % (remotefile), f.write)

def download_files(self, localDir='./', remoteDir='./'):
"""
从远程目录下,下载所有的文件并创建对应的目录
:param localdir: 本地文件夹
:param remotedir: 远程服务文件夹
:return:
"""
try:
self.ftp.cwd(remoteDir)
print self.ftp.pwd()
except:
self.debug_print(u'目录%s不存在,继续...' % remoteDir)
return
if not os.path.isdir(localDir):
os.makedirs(localDir)
self.debug_print(u'切换至目录 %s' % self.ftp.pwd())
self.file_list = []
#
# self.ftp.dir(self,*args) List a directory in long form
# 最后一个参数为回调函数,前面的不为空的参数,会跟list 组合成command
# 默认列出当前目录下的内容
#
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('..')
self.debug_print('返回上层目录 %s' % self.ftp.pwd())

def get_file_list(self, line):
"""

:param lines: ftp.dir() provide the line
:return: return the file list ,that get file name from line
"""
# ret_arr = []
file_arr = self.get_filename(line)
if file_arr[1] not in ['.', '..']:
self.file_list.append(file_arr)

def debug_print(self, s):
print s

def get_filename(self, line):
"""
line maybe :-rw-r--r-- 1 501 501 320294 Aug 24 05:08 1.d2dc00a98a6eee589f2e.chunk.js
:param line:
:return: return the first word of line and get the file name.
"""
pos = line.rfind(':')
while (line[pos] != ' '):
pos += 1
while (line[pos] == ' '):
pos += 1
file_arr = [line[0], line[pos:]]
return file_arr

if __name__ == '__main__':
localdir = r"d:\mysql\www"
# remoteDir = r"/"
xfer = FtpClient()
xfer.setFtpParams('', 'tny', '')
xfer.initEnv()
xfer.uploadDir(localDir=localdir)

python ftp批量上传文件下载文件的更多相关文章

  1. Python基于Python实现批量上传文件或目录到不同的Linux服务器

    基于Python实现批量上传文件或目录到不同的Linux服务器   by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用方法 1 1. 编辑配置文件conf/rootpath_fo ...

  2. linux下常用FTP命令 上传下载文件【转】

    1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...

  3. linux ftp批量上传和下载文件

    一.登录ftp 输入 ftp 192.168.1.111 输入用户名:ftpuser 输入密码:aaa123 二.转到目标目录 输入:cd   test   ----test为文件夹 三.批量上传 输 ...

  4. Linux 终端访问 FTP 及 上传下载 文件

    今天同事问我一个问题,在Linux 下访问FTP,并将文件上传上去. 我之前一直是用WinSCP工具的. 先将文件从linux copy到windows下,然后在传到ftp上.google 一下. 方 ...

  5. Linux 终端訪问 FTP 及 上传下载 文件

    今天同事问我一个问题,在Linux 下訪问FTP,并将文件上传上去. 我之前一直是用WinSCP工具的. 先将文件从linux copy到windows下,然后在传到ftp上. google 一下. ...

  6. Linux 终端访问 FTP 及 上传下载 文件[转]

    1.      Linux 终端连接FTP [oracle@Dave ~]$ ftp 10.85.7.97 Connected to 10.85.7.97. 220 Serv-U FTP Server ...

  7. 使用批处理文件在FTP服务器 上传下载文件

    1.从ftp服务器根目录文件夹下的文件到指定的文件夹下 格式:ftp -s:[配置文件] [ftp地址] 如:ftp -s:c:\vc\ftpconfig.txt   192.168.1.1 建立一个 ...

  8. Yii 图片FTP批量上传 并生成缩略图

    图片批量上传,前台使用 uploadify.swf,这个就不介绍了.这里使用两个扩展,一个是FTP上传的扩展,还有一个是生成缩略图的扩展地址:http://www.yiiframework.com/e ...

  9. shell通过ftp实现上传/下载文件

    直接代码,shell文件名为testFtptool.sh: #!/bin/bash ########################################################## ...

随机推荐

  1. Java基础系列--08_集合1

    ---恢复内容开始--- 集合当中有很多都是应用到泛型的技术,所以在讲集合之前,应该先将泛型的概念普及一下. 泛型:    (1)泛型是一种类型,但是这种类型是在编译或者调用方法时才确定.    (2 ...

  2. 程序员如何避免996、icu?欢迎来讨论一下。

    最近996icu火了,我以前就被996害了.现在还没缓过来,可能是自己体质比较弱吧. 以前的事就不说了,说说现在的想法吧.那么程序员如何才能避免996icu呢? 有两个基本因素: 1. 实现一个功能, ...

  3. Fedora中安装VMtools步骤

    第一次玩Fedora的系统,通过VMware工具安装的一个虚拟机,由于公司要求尽可能的留有足够空间,所以安装的时候就没选开发环境选项.安装成功后,又要准备安装VMware--tools工具,在此记录安 ...

  4. CodeForces Round #554 Div.2

    A. Neko Finds Grapes 代码: #include <bits/stdc++.h> using namespace std; ; int N, M; int a[maxn] ...

  5. Spark2.2 saveAsTable 函数使用 overWrite 设置 Partition 会造成全覆盖的问题

    在使用 CDH 6.0.X 的版本还是自带的是 Spark2.2 的版本,2.2 版本的 Spark 使用 saveAsTable 如果使用overWrite PartitionBy 的功能会有和 h ...

  6. EntityFramework Core笔记:保存数据(4)

    1. 基本保存 每个DBContext实例都有一个ChangeTracker,负责跟踪需要写入数据库的更改.当实例发生更改时,更改会被记录在ChangeTracker中,在调用 SaveChanges ...

  7. String.Join Method

    Overloads Join(String, String[], Int32, Int32) Concatenates the specified elements of a string array ...

  8. sts 创建springMVC项目---- maven和tomcat 错误处理

    今天学习spring的时候,学到了springMVC, 因为springMVC 就是beginning spring 书籍的第三章,为了更深入或更简单的起步学习springMVC, 我又找了另外一本书 ...

  9. Msi中文件替换

    转自https://blog.csdn.net/davidhsing/article/details/9962377 ※说明:目前可以用于MSI编辑的软件很多,但是有些软件在保存时会在MSI文件中写入 ...

  10. 修改MAC地址的方法 破解MAC地址绑定(抄)

    修改MAC地址的方法 破解MAC地址绑定   网卡的MAC地址是固化在网上EPROM中的物理地址,是一块网卡的“身份证”,通常为48位.在平常的应用中,有很多方面与MAC地址相关,如有些软件是和MAC ...