Python中默认安装的ftplib模块定义了FTP类,可用来实现简单的ftp客户端,用于上传或下载文件。

ftplib模块常用方法

ftp登陆连接
from ftplib import FTP #加载ftp模块
ftp=FTP() #设置变量
ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
ftp.connect("IP","port") #连接的ftp sever和端口
ftp.login("user","password") #连接的用户名,密码
print ftp.getwelcome() #打印出欢迎信息
ftp.cmd("xxx/xxx") #进入远程目录
bufsize=1024 #设置的缓冲区大小
filename="filename.txt" #需要下载的文件
file_handle=open(filename,"wb").write #以写模式在本地打开文件
ftp.retrbinaly("RETR filename.txt",file_handle,bufsize) #接收服务器上文件并写入本地文件
ftp.set_debuglevel(0) #关闭调试模式
ftp.quit() #退出ftp ftp相关命令操作
ftp.cwd(pathname) #设置FTP当前操作的路径
ftp.dir() #显示目录下所有目录信息
ftp.nlst() #获取目录下的文件
ftp.mkd(pathname) #新建远程目录
ftp.pwd() #返回当前所在位置
ftp.rmd(dirname) #删除远程目录
ftp.delete(filename) #删除远程文件
ftp.rename(fromname, toname)#将fromname修改名称为toname。
ftp.storbinaly("STOR filename.txt",file_handel,bufsize) #上传目标文件
ftp.retrbinary("RETR filename.txt",file_handel,bufsize) #下载FTP文件

FTP.quit()与FTP.close()的区别

  • FTP.quit():发送QUIT命令给服务器并关闭掉连接。这是一个比较“缓和”的关闭连接方式,但是如果服务器对QUIT命令返回错误时,会抛出异常。
  • FTP.close():单方面的关闭掉连接,不应该用在已经关闭的连接之后,例如不应用在FTP.quit()之后。

下载、上传文件

#!/usr/bin/python
# -*- coding: utf-8 -*-
# @Time : 2018/8/6 17:17
# @File : ftpclient.py
# @Software: PyCharm # FTP操作
from ftplib import FTP # 加载ftp模块
from ftplib import error_perm
from utils import file_util
import os
import time
import socket
from concurrent.futures import ThreadPoolExecutor host = '127.0.0.1'
username = 'egon'
password = '123456'
file = '1.txt'
port = 2111 def ftpconnect(host, port, username, password):
ftp = FTP()
# ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
ftp.encoding = 'utf-8' # 解决中文编码问题,默认是latin-1
try:
ftp.connect(host, port) # 连接
ftp.login(username, password) # 登录,如果匿名登录则用空串代替即可
print(ftp.getwelcome()) # 打印欢迎信息
except(socket.error, socket.gaierror): # ftp 连接错误
print("ERROR: cannot connect [{}:{}]" .format(host, port))
return None
except error_perm: # 用户登录认证错误
print("ERROR: user Authentication failed ")
return None
return ftp def is_ftp_file(ftp_conn, ftp_path):
try:
if ftp_path in ftp_conn.nlst(os.path.dirname(ftp_path)):
return True
else:
return False
except error_perm:
return False def downloadfile(ftp, remotepath, localpath):
"""
下载文件
:param ftp:
:param remotepath:
:param localpath:
:return:
"""
bufsize = 1024 # 设置缓冲块大小
fp = open(localpath, 'wb') # 以写模式在本地打开文件 res = ftp.retrbinary(
'RETR ' + remotepath,
fp.write,
bufsize) # 接收服务器上文件并写入本地文件
if res.find('226') != -1:
print('download file complete', localpath)
ftp.set_debuglevel(0) # 关闭调试
fp.close() # 关闭文件 def uploadfile(ftp, remotepath, localpath):
"""
上传文件
:param ftp:
:param remotepath:
:param localpath:
:return:
"""
bufsize = 1024
fp = open(localpath, 'rb')
res = ftp.storbinary('STOR ' + remotepath, fp, bufsize) # 上传文件
if res.find('226') != -1:
print('upload file complete', remotepath)
ftp.set_debuglevel(0)
fp.close()
def ftp_theadpool(func, ftp, file_list):
"""
通过线程池调用上传文件列表
:param func:
:param file_list:
:return:
"""
pool = ThreadPoolExecutor(6)
for remotepath, localpath in file_list:
pool.submit(func, ftp, remotepath, localpath)
pool.shutdown() if __name__ == "__main__":
ftp = ftpconnect(host, port, username, password)
file_list = ftp.nlst()
print(file_list)
# 将传输模式改为二进制模式 ,避免提示 ftplib.error_perm: 550 SIZE not allowed in ASCII
# mode错误
ftp.voidcmd('TYPE I')
file_size = ftp.size("sqldeveloper-3.1.07.42.zip") # 文件大小 print('filesize [{}]'.format(file_util.bytes2human(file_size)))
start = time.time()
downloadfile(ftp, "sqldeveloper-3.1.07.42.zip", "e:/x.zip")
end = time.time()
print('consume time [{}]'.format(end - start)) if '20180910' not in file_list: # 创建目录
res = ftp.mkd('20180910')
print('mk ', res) ftp.cwd('20180910') # 进入到新目录
print("FTP当前路径:", ftp.pwd())
print("文件信息:", ftp.nlst()) uploadfile(ftp, "testup.zip", "e:/x.zip") # 上传文件
# ftp.cwd('20180910')
# pwd_path = ftp.pwd()
# print("FTP当前路径:", pwd_path)
# print("文件信息:", ftp.nlst())
ftp.quit()

  

带进度条下载文件

from ftplib import FTP
from ftplib import error_perm
import os
import socket
import os
import time
from utils import my_logset
from utils.time_utils import run_time
import sys
import math
from utils import file_util """
ftp操作上传和下载
""" class FTP_OPS(object):
"""
ftp文件操作
""" def __init__(self, log_file, ftp_ip, ftp_port, ftp_user, ftp_pwd):
self.db_log = my_logset.get_mylogger("ftp", log_file)
self.ftp_ip = ftp_ip
self.ftp_port = ftp_port
self.ftp_user = ftp_user
self.ftp_pwd = ftp_pwd def ftp_connect(self):
"""
连接ftp
:return:
"""
socket.setdefaulttimeout(160) # 超时FTP时间设置为60秒
ftp = FTP()
ftp.connect(host=self.ftp_ip, port=self.ftp_port)
ftp.set_debuglevel(2) # 开启调试模式
ftp.encoding = 'utf-8' try:
ftp.login(self.ftp_user, self.ftp_pwd)
self.db_log.info(
'[{}]login ftp {}'.format(
self.ftp_user,
ftp.getwelcome())) # 打印欢迎信息 except(socket.error, socket.gaierror): # ftp 连接错误
self.db_log.warn(
"ERROR: cannot connect [{}:{}]".format(
self.ftp_ip, self.ftp_port))
return None except error_perm: # 用户登录认证错误
self.db_log.warn("ERROR: user Authentication failed ")
return None
except Exception as e:
print(e)
return None
return ftp @run_time
def upload_file(self, ftp: FTP, remotepath: str,
localpath: str, file: str):
"""
# 从本地上传文件到ftp
:param ftp: ftp对象
:param remotepath: ftp远程路径
:param localpath: 本地
:return:
"""
flag = False
buffer_size = 10240 # 默认是8192
print(ftp.getwelcome()) # 显示登录ftp信息 fp = open(os.path.join(localpath, file), 'rb') try:
ftp.cwd(remotepath) # 进入远程目录
self.db_log.info(
"found folder [{}] in ftp server, upload processing.".format(remotepath))
print('进入目录', ftp.pwd())
# 将传输模式改为二进制模式 ,避免提示 ftplib.error_perm: 550 SIZE not allowed in
# ASCII
ftp.voidcmd('TYPE I')
ftp.storbinary('STOR ' + file, fp, buffer_size)
ftp.set_debuglevel(0)
self.db_log.info("上传文件 [{}] 成功".format(file))
flag = True
except error_perm as e:
self.db_log.warn('文件[{}]传输有误,{}'.format(file, str(e)))
except TimeoutError:
self.db_log.warn('文件[{}]传输超时'.format(file))
pass
except Exception as e:
self.db_log.warn('文件[{}]传输异常'.format(file, str(e)))
pass
finally:
fp.close() return {'file_name': file, 'flag': flag} def download_file(self, ftp_file_path, dst_file_path):
"""
从ftp下载文件到本地
:param ftp_file_path: ftp下载文件
:param dst_file_path: 本地存放
:return:
"""
buffer_size = 10240 # 默认是8192
ftp = self.ftp_connect()
print(ftp.getwelcome()) # 显示登录ftp信息 # 将传输模式改为二进制模式 ,避免提示 ftplib.error_perm: 550 SIZE not allowed in ASCII
ftp.voidcmd('TYPE I')
remote_file_size = ftp.size(ftp_file_path) # 文件总大小 print('remote filesize [{}]'.format(remote_file_size))
cmpsize = 0 # 下载文件初始大小
lsize = 0
# check local file isn't exists and get the local file size
if os.path.exists(dst_file_path):
lsize = os.stat(dst_file_path).st_size
if lsize >= remote_file_size:
print('local file is bigger or equal remote file')
return
start = time.time()
conn = ftp.transfercmd('RETR {0}'.format(ftp_file_path), lsize) f = open(dst_file_path, "ab")
while True:
data = conn.recv(buffer_size)
if not data:
break
f.write(data)
cmpsize += len(data)
self.progressbar(cmpsize, remote_file_size)
# print(
# '\b'*30, 'download process:%.2f%%' %
# (float(cmpsize) / remote_file_size * 100))
# ftp.retrbinary(
# 'RETR {0}'.format(ftp_file_path),
# f.write,
# buffer_size)
f.close()
try:
ftp.voidcmd('NOOP')
print('keep alive cmd success')
ftp.voidresp()
print('No loop cmd')
conn.close()
ftp.quit()
except Exception as e:
pass
finally:
end = time.time()
print('consume time [{}]'.format(end - start))
file_size = os.stat(dst_file_path).st_size
print('local filesize [{}] md5:[{}]'.format(
file_size, file_util.get_md5(dst_file_path))) def progressbar(cur, total):
"""
进度条显示
cur表示当前的数值,total表示总的数值。
:param cur:
:param total:
:return:
"""
percent = '{:.2%}'.format(cur / total)
sys.stdout.write('\r')
sys.stdout.write('[%-50s] %s' %
('=' * int(math.floor(cur * 50 / total)), percent))
sys.stdout.flush()
if cur == total:
sys.stdout.write('\n') if __name__ == '__main__':
host = "10.0.0.1"
username = "test"
password = "test"
port = ""
ftp_file_path = "/data/an/1.zip"
dst_file_path = "/data/tmp/1.zip"
ftp = FTP_OPS(host=host, username=username, password=password, port=port)
ftp.download_file(ftp_file_path=ftp_file_path, dst_file_path=dst_file_path)

  

python ftplib模块使用的更多相关文章

  1. Python ftplib模块

    Python ftplib模块 官方文档:https://docs.python.org/3/library/ftplib.html?highlight=ftplib#module-ftplib 实例 ...

  2. 关于Python, ftplib模块中的cwd()进入含中文目录失败的问题

    使用Python的ftplib模块连接ftp服务器时, 使用cwd()连接含中文的目录, 报错 : UnicodeEncodeError: 'latin-1' codec can't encode c ...

  3. Python ftplib 模块关于 ftp的下载

    import ftplib import os import socket import sys HOST='192.168.216.193' DIRN='c:\\ftp\FTP.123' FILE= ...

  4. Python之ftplib模块

    一.引言: 某一天,开发哥们跟我反映lftp和java写的ftp程序下载文件有问题,具体情况如下:当一个大于1G的文件已经下载完毕以后一直出现夯住的情况.为了重现开发哥们所说情况,我就自己用pytho ...

  5. python之模块ftplib(实现ftp上传下载代码)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(实现ftp上传下载代码) #需求:实现ftp上传下载代码(不含错误处理) f ...

  6. python之模块ftplib(FTP协议的客户端)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(FTP协议的客户端) #需求:快速进行ftp上传 ,下载,查询文件 from ...

  7. ftplib模块【python】

    转自:http://www.cnblogs.com/kaituorensheng/p/4480512.html 函数释义 Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实 ...

  8. python中的ftplib模块

    前言 Python中默认安装的ftplib模块定义了FTP类. ftplib模块相关参数: 加载ftp模块:from ftplib import FTP ftp = FTP()#设置变量ftp.set ...

  9. python的ftplib模块

    Python中的ftplib模块 Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件 FTP的工作流程及基本操作可参考协议RFC95 ...

随机推荐

  1. fiddler抓包时显示Tunnel to......443是怎么回事

    之前公司的app使用的http协议,因此不需要安装证书也能够转包. 后来改成https协议后,在使用fiddler进行抓包时,一直出现tunnel to 443. 百度了好久也没有具体的解决办法,后来 ...

  2. from __future__ import

    读代码的过程中看到的,好奇搜索了一下,其实当在我们调试别人Python代码的过程中经常会遇到一些问题,比如版本不同,代码也会有所改变,比如print函数 Python 2.7版本为 print “ ” ...

  3. 2019.01.22 bzoj3875: [Ahoi2014&Jsoi2014]骑士游戏(spfa+dp)

    传送门 题意简述:nnn个怪物,对于编号为iii的怪物可以选择用aia_iai​代价将其分裂成另外的bib_ibi​个怪物或者用cic_ici​代价直接消灭它,现在问消灭编号为1的怪物用的最小代价. ...

  4. 2018.11.24 poj1743Musical Theme(二分答案+后缀数组)

    传送门 代码: 二分答案. 然后对于预处理的heightheightheight数组分成几段. 保证每一段中都是连续的几个heightheightheight并且这些heightheightheigh ...

  5. js保存,获取,删除cookie的操作

    [转]来自:http://blog.csdn.net/itmyhome1990/article/details/7363816 JSP表单页面 <form action="login& ...

  6. SQL错误

    一.mybatis框架XML错误 1.ORA-00918: 未明确定义列:SQL语句中列明重复,或者定义不明确(关联查询时两张表都有要区分开列明) 2.无效的列类型: 1111  :a.传入数据漏传一 ...

  7. (5)How to let go of being a "good" person — and become a better person

    https://www.ted.com/talks/dolly_chugh_how_to_let_go_of_being_a_good_person_and_become_a_better_perso ...

  8. MariaDBConn用于链接MariaDB的管理类

    https://downloads.mariadb.com/Connectors/java/connector-java-2.2.3/ public class MariaDBConn { final ...

  9. 链家web前端面试

    共有三轮面试,每个面试官的第一个问题都是:介绍一个你觉着比较出彩的项目 第一轮面试: 因为公司项目没什么亮点,很传统的pc端,美女面试官就说让讲一下我用react的私人项目; 问了很多都是关于reac ...

  10. HTTP 错误 404.17 - Not Found和 HTTP 错误 404.2 - Not Found 解决办法

    HTTP 404.2 - Not Found" IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理 解决办法: 使用aspnet_regiis.exe注册.NET Fr ...