详解Python下ftp上传文件linux服务器


Posted in Python onJune 21, 2018

模块介绍:

from ftplib import FTP
 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.dir() 能显示目录下的文件信息,考虑到要分别对文件夹个数和文件数目进行统计,文件夹下存在文件夹和文件嵌套;将dir()后的目录信息放入列表,对列表进行操作;进入子文件夹后进行递归调用操作。

# -*- coding: utf-8 -*-
 
 from ftplib import FTP
 
 ftp = FTP()
 ftp.connect('132.121.xx.xxx', 'xx909')
 ftp.login('crmyun_xxx', 'wyjjjjxJ')
 sum1 = 0
 sum2 = 0
 value = 0
 
 def search_file(start_dir):
  ftp.cwd(start_dir)
  print ftp.pwd()
  dir_res = []
  ftp.dir('.', dir_res.append) #对当前目录进行dir(),将结果放入列表
  for i in dir_res:
   if i.startswith("d"):
    global sum1 
    sum1 += 1
    search_file(ftp.pwd()+"/"+i.split(" ")[-1])
    ftp.cwd('..')
   else:
    global sum2, value
    sum2 += 1
    val = i.split(" ")[-1]
    value += ftp.size(val)
    if ftp.pwd().endswith('/'):    
 #    print ftp.pwd()+val+"  "+str(ftp.size(val))+" B" #打印出每个文件路径和大小
     pass
    else:    
 #    print ftp.pwd()+"/"+val+"  "+str(ftp.size(val))+" B"
     pass
 def sum_file(file_path):
  search_file(file_path)
  print "folder number is "+str(sum1)+", file number is "+str(sum2)+", Totle size is "+str(value)+" B"
  
 
 if __name__ == '__main__':
  sum_file("/apps/crmyun/crmyun_755")

展示结果:

详解Python下ftp上传文件linux服务器

完整上传程序

Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件,函数列举如下

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()之后。

例:下载、上传文件

# coding: utf-8
from ftplib import FTP
import time
import tarfile
import os
# !/usr/bin/python
# -*- coding: utf-8 -*-

from ftplib import FTP

def ftpconnect(host, username, password):
 ftp = FTP()
 # ftp.set_debuglevel(2)
 ftp.connect(host, 21)
 ftp.login(username, password)
 return ftp

#从ftp下载文件
def downloadfile(ftp, remotepath, localpath):
 bufsize = 1024
 fp = open(localpath, 'wb')
 ftp.retrbinary('RETR ' + remotepath, fp.write, bufsize)
 ftp.set_debuglevel(0)
 fp.close()

#从本地上传文件到ftp
def uploadfile(ftp, remotepath, localpath):
 bufsize = 1024
 fp = open(localpath, 'rb')
 ftp.storbinary('STOR ' + remotepath, fp, bufsize)
 ftp.set_debuglevel(0)
 fp.close()

if __name__ == "__main__":
 ftp = ftpconnect("113.105.139.xxx", "ftp***", "Guest***")
 downloadfile(ftp, "Faint.mp4", "C:/Users/Administrator/Desktop/test.mp4")
 #调用本地播放器播放下载的视频
 os.system('start "C:\Program Files\Windows Media Player\wmplayer.exe" "C:/Users/Administrator/Desktop/test.mp4"')
 uploadfile(ftp, "C:/Users/Administrator/Desktop/test.mp4", "test.mp4")

 ftp.quit()
Python 相关文章推荐
Python中的CURL PycURL使用例子
Jun 01 Python
Python urlopen()函数 示例分享
Jun 12 Python
python中的格式化输出用法总结
Jul 28 Python
在Python中过滤Windows文件名中的非法字符方法
Jun 10 Python
在Pycharm中使用GitHub的方法步骤
Jun 13 Python
Django接收post前端返回的json格式数据代码实现
Jul 31 Python
python求质数列表的例子
Nov 24 Python
Python编译为二进制so可执行文件实例
Dec 23 Python
Pytorch to(device)用法
Jan 08 Python
spyder 在控制台(console)执行python文件,debug python程序方式
Apr 20 Python
解决在keras中使用model.save()函数保存模型失败的问题
May 21 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 11 Python
Python爬取数据并写入MySQL数据库的实例
Jun 21 #Python
python实现黑客字幕雨效果
Jun 21 #Python
python实现内存监控系统
Mar 07 #Python
Python之csv文件从MySQL数据库导入导出的方法
Jun 21 #Python
python 从csv读数据到mysql的实例
Jun 21 #Python
OPENCV去除小连通区域,去除孔洞的实例讲解
Jun 21 #Python
python读取文本绘制动态速度曲线
Jun 21 #Python
You might like
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
PHP按行读取文件时删除换行符的3种方法
2014/05/04 PHP
详解WordPress中分类函数wp_list_categories的使用
2016/01/04 PHP
Laravel重写用户登录简单示例
2016/10/08 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
JS Array.slice 截取数组的实现方法
2016/01/02 Javascript
Javascript的无new构建实例详解
2016/05/15 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
JS定时器实现数值从0到10来回变化
2016/12/09 Javascript
jQuery Chosen通用初始化
2017/03/07 Javascript
元素全屏的设置与监听实例
2017/11/28 Javascript
基于js 各种排序方法和sort方法的区别(详解)
2018/01/03 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
JavaScript模拟实现自由落体效果
2018/08/28 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
python使用PIL模块实现给图片打水印的方法
2015/05/22 Python
python 默认参数问题的陷阱
2016/02/29 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
python paramiko远程服务器终端操作过程解析
2019/12/14 Python
使用python自动追踪你的快递(物流推送邮箱)
2020/03/17 Python
Python错误的处理方法
2020/06/23 Python
Pycharm操作Git及GitHub的步骤详解
2020/10/27 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
2021/02/22 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
应用化学专业职业生涯规划书
2013/12/31 职场文书
高中生物教学反思
2014/02/05 职场文书
中专生自荐信
2014/06/25 职场文书
吃空饷专项整治方案
2014/10/27 职场文书
2016年情人节广告语
2016/01/28 职场文书
MyBatis 动态SQL全面详解
2021/10/05 MySQL
剖析后OpLog订阅MongoDB的数据变更就没那么难了
2022/02/24 MongoDB