首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python ftp工具类 上传、下载文件夹 封装类

python ftp工具类 上传、下载文件夹 封装类

作者头像
用户5760343
发布于 2022-05-13 01:56:01
发布于 2022-05-13 01:56:01
1.3K00
代码可运行
举报
文章被收录于专栏:sktjsktj
运行总次数:0
代码可运行

-------------------------常用工具------------------------------------------------------------

!/bin/env python

import os, sys, ftplib from getpass import getpass from mimetypes import guess_type, add_type

dfltSite = 'home.rmi.net' dfltRdir = '.' dfltUser = 'lutz'

class FtpTools:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def getlocaldir(self):
    return (len(sys.argv) > 1 and sys.argv[1]) or '.'

def getcleanall(self):
    return input('Clean target dir first?')[:1] in ['y','Y']

def getpassword(self):
    return getpass(
           'Password for %s on %s:' % (self.remoteuser, self.remotesite))

def configTransfer(self, site=dfltSite, rdir=dfltRdir, user=dfltUser):
    self.nonpassive = False             # passive FTP on by default in 2.1+
    self.remotesite = site              # transfer to/from this site
    self.remotedir  = rdir              # and this dir ('.' means acct root)
    self.remoteuser = user
    self.localdir   = self.getlocaldir()
    self.cleanall   = self.getcleanall()
    self.remotepass = self.getpassword()

def isTextKind(self, remotename, trace=True):
    add_type('text/x-python-win', '.pyw')                    # not in tables
    mimetype, encoding = guess_type(remotename, strict=False)# allow extras
    mimetype  = mimetype or '?/?'                            # type unknown?
    maintype  = mimetype.split('/')[0]                       # get 1st part
    if trace: print(maintype, encoding or '')
    return maintype == 'text' and encoding == None           # not compressed

def connectFtp(self):
    print('connecting...')
    connection = ftplib.FTP(self.remotesite)           # connect to FTP site
    connection.login(self.remoteuser, self.remotepass) # log in as user/pswd
    connection.cwd(self.remotedir)                     # cd to dir to xfer
    if self.nonpassive:                                # force active mode
        connection.set_pasv(False)                     # most do passive
    self.connection = connection

def cleanLocals(self):
    if self.cleanall:
        for localname in os.listdir(self.localdir):    # local dirlisting
            try:                                       # local file delete
                print('deleting local', localname)
                os.remove(os.path.join(self.localdir, localname))
            except:
                print('cannot delete local', localname)

def cleanRemotes(self):
    if self.cleanall:
        for remotename in self.connection.nlst():       # remote dir listing
            try:                                        # remote file delete
                print('deleting remote', remotename)
                self.connection.delete(remotename)
            except:
                print('cannot delete remote', remotename)

def downloadOne(self, remotename, localpath):
    if self.isTextKind(remotename):
        localfile = open(localpath, 'w', encoding=self.connection.encoding)
        def callback(line): localfile.write(line + '\n')
        self.connection.retrlines('RETR ' + remotename, callback)
    else:
        localfile = open(localpath, 'wb')
        self.connection.retrbinary('RETR ' + remotename, localfile.write)
    localfile.close()

def uploadOne(self, localname, localpath, remotename):
    if self.isTextKind(localname):
        localfile = open(localpath, 'rb')
        self.connection.storlines('STOR ' + remotename, localfile)
    else:
        localfile = open(localpath, 'rb')
        self.connection.storbinary('STOR ' + remotename, localfile)
    localfile.close()

def downloadDir(self):
    remotefiles = self.connection.nlst()         # nlst is remote listing
    for remotename in remotefiles:
        if remotename in ('.', '..'): continue
        localpath = os.path.join(self.localdir, remotename)
        print('downloading', remotename, 'to', localpath, 'as', end=' ')
        self.downloadOne(remotename, localpath)
    print('Done:', len(remotefiles), 'files downloaded.')

def uploadDir(self):
    localfiles = os.listdir(self.localdir)       # listdir is local listing
    for localname in localfiles:
        localpath = os.path.join(self.localdir, localname)
        print('uploading', localpath, 'to', localname, 'as', end=' ')
        self.uploadOne(localname, localpath, localname)
    print('Done:', len(localfiles), 'files uploaded.')

def run(self, cleanTarget=lambda:None, transferAct=lambda:None):
    self.connectFtp()
    cleanTarget()
    transferAct()
    self.connection.quit()

if name == 'main': ftp = FtpTools() xfermode = 'download' if len(sys.argv) > 1: xfermode = sys.argv.pop(1) # get+del 2nd arg if xfermode == 'download': ftp.configTransfer() ftp.run(cleanTarget=ftp.cleanLocals, transferAct=ftp.downloadDir) elif xfermode == 'upload': ftp.configTransfer(site='learning-python.com', rdir='books', user='lutz') ftp.run(cleanTarget=ftp.cleanRemotes, transferAct=ftp.uploadDir) else: print('Usage: ftptools.py ["download" | "upload"] [localdir]')

------------------------------------------------------------------#上传目录树

!/bin/env python

import os, ftptools

class UploadAll(ftptools.FtpTools): def init(self): self.fcount = self.dcount = 0

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def getcleanall(self):
    return False  # don't even ask

def uploadDir(self, localdir):
    localfiles = os.listdir(localdir)
    for localname in localfiles:
        localpath = os.path.join(localdir, localname)
        print('uploading', localpath, 'to', localname, end=' ')
        if not os.path.isdir(localpath):
            self.uploadOne(localname, localpath, localname)
            self.fcount += 1
        else:
            try:
                self.connection.mkd(localname)
                print('directory created')
            except:
                print('directory not created')
            self.connection.cwd(localname)             # change remote dir
            self.uploadDir(localpath)                  # upload local subdir
            self.connection.cwd('..')                  # change back up
            self.dcount += 1
            print('directory exited')

if name == 'main': ftp = UploadAll() ftp.configTransfer(site='learning-python.com', rdir='training', user='lutz') ftp.run(transferAct = lambda: ftp.uploadDir(ftp.localdir)) print('Done:', ftp.fcount, 'files and', ftp.dcount, 'directories uploaded.')

----------------------------------------------删除远程目录树

!/bin/env python

from ftptools import FtpTools

class CleanAll(FtpTools): """ delete an entire remote tree of subdirectories """ def init(self): self.fcount = self.dcount = 0

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def getlocaldir(self):
    return None  # irrelevent here

def getcleanall(self):
    return True  # implied here

def cleanDir(self):
    lines = []                                   # each level has own lines
    self.connection.dir(lines.append)            # list current remote dir
    for line in lines:
        parsed  = line.split()                   # split on whitespace
        permiss = parsed[0]                      # assume 'drw... ... filename'
        fname   = parsed[-1]
        if fname in ('.', '..'):                 # some include cwd and parent
            continue
        elif permiss[0] != 'd':                  # simple file: delete
            print('file', fname)
            self.connection.delete(fname)
            self.fcount += 1
        else:                                    # directory: recur, del
            print('directory', fname)
            self.connection.cwd(fname)           # chdir into remote dir
            self.cleanDir()                      # clean subdirectory
            self.connection.cwd('..')            # chdir remote back up
            self.connection.rmd(fname)           # delete empty remote dir
            self.dcount += 1
            print('directory exited')

if name == 'main': ftp = CleanAll() ftp.configTransfer(site='learning-python.com', rdir='training', user='lutz') ftp.run(cleanTarget=ftp.cleanDir) print('Done:', ftp.fcount, 'files and', ftp.dcount, 'directories cleaned.')

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python 下载FTP服务器所有文件 封装类
import os, sys, ftplib from getpass import getpass from mimetypes import guess_type, add_type
用户5760343
2022/05/13
1.2K0
python 上传所有文件到FTP服务器 脚本
import os, sys, ftplib from getpass import getpass from mimetypes import guess_type
用户5760343
2022/05/13
2.1K0
python ftp 下载所有文件到本地 脚本
import os, sys, ftplib from getpass import getpass from mimetypes import guess_type
用户5760343
2022/05/13
1.9K0
python 目录复制类 脚本
""" Use: "python ...\Tools\visitor_cpall.py fromDir toDir trace?" Like System\Filetools\cpall.py,
用户5760343
2022/05/13
5800
python ftp下载文件 脚本
------------------------------------------getfile.py
用户5760343
2022/05/13
1.2K0
python 查找文件、删除、搜索类 脚本
""" Use: "python ...\Tools\visitor_collect.py searchstring rootdir". CollectVisitor simply collects a list of all files containing a search string, for display or later processing (e.g., replacement, auto-editing); pass in a test filename extensions list to constructor to override the default in SearchVisitor; this is roughy like find+grep for text exts; """
用户5760343
2022/05/13
6820
python 遍历目录类 脚本
""" #################################################################################### Test: "python ...\Tools\visitor.py dir testmask [string]". Uses classes and subclasses to wrap some of the details of os.walk call usage to walk and search; testmask is an integer bitmask with 1 bit per available self-test; see also: visitor_*/.py subclasses use cases; frameworks should generally use__X pseudo private names, but all names here are exported for use in subclasses and clients; redefine reset to support multiple independent walks that require subclass updates; #################################################################################### """
用户5760343
2022/05/13
7530
ftp工具类:上传与下载文件
linux服务器搭建ftp服务: https://program.blog.csdn.net/article/details/88825921
全栈程序员站长
2022/08/26
4K0
python ftp下载文件 脚本
import os, sys from getpass import getpass # hidden password input from ftplib import FTP # socket-based FTP tools
用户5760343
2022/05/13
1K0
python 更新svn 并 ftp更新
#!/usr/bin/env python # -*- coding:utf-8 -*- import pysvn import locale import datetime import sys import os import json from ftplib import FTP def setlocale(): language_code, encoding = locale.getdefaultlocale() if language_code is None:
py3study
2020/01/09
1.7K0
python 互联网编程
zope\plone\pylons\web2py\cherrypy\webware:web框架 pyjamas soap:web service Ironpython 1\ socket(AF_INET,SOCK_STREAM) SOCK_DGRAM AF_UNIF sobj.bind() sobj.listen con,dre=sobj.accept() con.receive() con.send() con.close() socket(xx) sobj.connect()
用户5760343
2022/05/13
4380
python 互联网编程
python ftp
完全是循环,目录的进行循环操作,而文件下载。最底层目录的文件下载完,回归上级目录。继续循环。
py3study
2020/01/09
9.2K0
python ftp和sftp的例子
YESTERDAY = TODAY - datetime.timedelta(days=1)
py3study
2020/01/07
1.4K0
FTP工具类
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.SocketException; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPCli
一笠风雨任生平
2019/08/02
1.7K0
Python 基于Python实现Ftp文件上传,下载
支持FTP文件上传、下载,可以上传目录(分区除外),也可以上传单个文件;可以下载整个目录(/根目录除外),也可以下载单个文件
授客
2019/09/11
5.7K0
Python 基于Python实现Ftp文件上传,下载
python ftp上传文件 脚本
import ftplib # socket-based FTP tools
用户5760343
2022/05/13
5.6K0
python搭建FTP服务器之FTP上传和下载
Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件,函数列举如下
周小董
2019/03/25
10.9K0
python urllib.request 下载文件 脚本
!/usr/local/bin/python import os, getpass from urllib.request import urlopen # socket-based w
用户5760343
2022/05/13
5130
FTP命令 上传下载文件[通俗易懂]
格式:ftp [hostname| ip-address] a)在linux命令行下输入:
全栈程序员站长
2022/11/08
5.9K0
Android 向FTP服务器上传以及下载文件
首先我们要用到commons-net-3.3.jar包 可以去网上下载 找不到可私信我 好了,下面直接上代码 封装了一个类出来可直接使用
longzeqiu
2019/08/14
3K2
相关推荐
python 下载FTP服务器所有文件 封装类
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档