[Python编程(第4版)].(Programming.Python.4th.Edition).Mark.Lutz.文字版

(yzsuai) #1

invoke both an upload and download; for the uploadall variant and possibly
others, also make single file upload/download code in orig loops methods;
##############################################################################
"""


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


defaults for all clients


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


class FtpTools:


allow these 3 to be redefined


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):
"""
get upload or download parameters
from module defaults, args, inputs, cmdline
anonymous ftp: user='anonymous' pass=emailaddr
"""
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):
"""
use mimetypes to guess if filename means text or binary
for 'f.html, guess is ('text/html', None): text
for 'f.jpeg' guess is ('image/jpeg', None): binary
for 'f.txt.gz' guess is ('text/plain', 'gzip'): binary
for unknowns, guess may be (None, None): binary
mimetypes can also guess name from type: see PyMailGUI
"""
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 '')


Transferring Directories with ftplib | 889
Free download pdf