记录学习笔记、分享资源工具、交流技术思想、提升工作效率

python操作ftp

后端 xiaomudk 6年前 (2015-07-25) 1316次浏览 0个评论
文章目录[隐藏]

python中操作ftp的模式叫ftplib,其实也就是封装的socket。下面是我学习ftplib使用的笔记:

一.ftp操作

1.连接并登陆ftp

from ftplib import FTP
ftp = FTP()                                             #先进行实例化
ftp.connect(host='10.10.30.236',port=21,timeout=300)    #port和timeout必须为数字
ftp.login(user='ostest',passwd='test.123456')           #登陆
print ftp.getwelcome()                                  #欢迎信息

2.上传下载操作

#下载
file_handler = open('/tmp/123.txt', 'wb')
self.retrbinary(u'RETR %s'%('test.html'), file_handler.write)

#上传
file_handler = open('/tmp/abc.html', 'rb')
self.storbinary('STOR %s' %('abc.html'), file_handler)

3.其它操作

getwelcome()                打印欢迎信息
pwd()                       当前工作目录
cwd(path)                   把当前工作目录设置为path
dir([path[,...[,cb]])       显示path 目录里的内容,可选的参数cb 是一个回调函数,会被传给retrlines()方法
nlst([path[,...])           与dir()类似,但返回一个文件名的列表,而不是显示这些文件名
retrlines(cmd [, cb])       给定FTP 命令(如“RETR filename”),用于下载文本文件。可选的回调函数cb 用于处理文件的每一行
retrbinary(cmd, cb[,bs=8192[, ra]])     与retrlines()类似,只是这个指令处理二进制文件。回调函数cb 用于处理每一块(块大小默认为8K)下载的数据。
storlines(cmd, f)           给定FTP 命令(如“STOR filename”),以上传文本文件。要给定一个文件对象f
storbinary(cmd, f[,bs=8192])    与storlines()类似,只是这个指令处理二进制文件。要给定一个文件对象f,上传块大小bs 默认为8Kbs=8192])
rename(old, new)            把远程文件old 改名为new
delete(path)                删除远程文件
rmd(dirname)                删除远程目录
mkd(directory)              创建远程目录
set_debuglevel(2)           打开调试级别2,显示详细信息
set_debuglevel(0)           关闭调试模式
quit()                      发送QUIT命令给服务器并关闭掉连接。这是一个比较“缓和”的关闭连接方式,但是如果服务器对QUIT命令返回错误时,会抛出异常。
close()                     单方面的关闭掉连接,不应该用在已经关闭的连接之后,例如不应用在FTP.quit()之后。

4.完整的实例

这是我根据网上的实例,稍做了修改后的代码:

#!/usr/bin/python
# coding:utf-8

from ftplib import FTP
import os
import sys

class MYFTP(FTP):
    """
    ftp自动下载、自动上传脚本,可以递归目录操作
    """

    def __init__(self, host='', port=21, user='', passwd='', timeout=-999 ):
        try:
            self.connect(host, port, timeout)
            self.login(user, passwd)
        except Exception,e:
            print e
            sys.exit(1)

    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
        print('localfile_size:%d  remotefile_size:%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):
            #print(u'%s 文件大小相同,无需下载' %localfile)
            #return
        #else:

        #if os.path.isdir(localfile):
            ##如果本地是目录不是文件
            #fname = os.path.basename(remotefile)
            #localfile = os.path.join(localfile,fname)

        print(u'>>>>>>>>>>>>下载文件 %s ... ...' %localfile)

        try:
            file_handler = open(localfile, 'wb')
            self.retrbinary(u'RETR %s'%(remotefile), file_handler.write)
        except:

            return False

        file_handler.close()

        return True

    def download_files(self, localdir='./', remotedir='./'):
        """
        下载目录下所有文件
        """
        print remotedir
        try:
            self.cwd(remotedir)
        except:
            print(u'目录%s不存在,继续...' %remotedir)
            return
        if not os.path.isdir(localdir):
            os.makedirs(localdir)
        print(u'切换至目录 %s' %self.pwd())
        self.file_list = []
        self.dir(self.get_file_list)
        remotenames = self.file_list
        print remotenames
        #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.cwd('..')
        print(u'返回上层目录 %s' %self.pwd())

    def upload_file(self, localfile, remotefile):
        """
        文件上传
        """

        if not os.path.isfile(localfile):
            return
        #if self.is_same_size(localfile, remotefile):
            #print(u'跳过[相等]: %s' %localfile)
            #return

        remote_filename = os.path.basename(remotefile)

        print(u'>>>>>>>>>>>>上传文件 %s ... ...' %localfile)

        file_handler = open(localfile, 'rb')

        try:

            self.storbinary('STOR %s' %remotefile, file_handler)
        except:

            local_filename = os.path.basename(localfile)
            remotefile = remotefile + "/" + local_filename

            #print(u'>>>>>>>>>>>>上传失败,重新上传文件 %s ... ...' %localfile)

            self.storbinary('STOR %s' %remotefile, file_handler)

        file_handler.close()
        print(u'已传送: %s' %localfile)

    def upload_files(self, localdir='./', remotedir = './'):
        """
        上传目录下文件
        """

        if not os.path.isdir(localdir):
            return
        localnames = os.listdir(localdir)
        self.cwd(remotedir)
        for item in localnames:
            src = os.path.join(localdir, item)
            if os.path.isdir(src):
                try:
                    self.mkd(item)
                except:
                    print(u'目录已存在 %s' %item)
                self.upload_files(src, item)
            else:
                self.upload_file(src, item)
        self.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(':')
        print pos
        while(line[pos] != ' '):
            pos += 1
        print pos
        while(line[pos] == ' '):
            pos += 1
        file_arr = [line[0], line[pos:]]
        return file_arr

参考资料

ftplib官方文档


本网站采用知识共享署名-相同方式共享 4.0 国际许可协议进行授权
转载请注明原文链接:python操作ftp
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址