首页 >> 手游攻略

夹小玩具出门WRITEAS(带你用python写一个下载文件的小工具)

老铁们,大家好,相信还有很多朋友对于夹小玩具出门WRITEAS和带你用python写一个下载文件的小工具的相关问题不太懂,没关系,今天就由我来为大家分享分享夹小玩具出门WRITEAS以及带你用python写一个下载文件的小工具的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

关于Python,相信很多人都有所耳闻。经过近三十年的发展,再加上近几年AI的兴起,Python作为一种科学语言的流行程度急剧上升。而Python语法简单、语句清晰的特点,可以让程序员把精力集中在业务逻辑上,减轻我们的压力。毕竟人生苦短,我用Python。看看Python之父--GuidovanRossum的发量,在对比下Java之父——JamesGosling。。。

我们需要做一个下载文件并压缩保存的小工具,最好能多个目的地址同时下载。所以我们会用到以下功能:

importparamikonimportthreadingnimportjsonnimportosnimportsysfromstatnimportS_ISDIRasisdirnimportloggingnimportzipfilenimporttime获取ftp连接

#建立连接,获取sftp句柄nndefsftp_connect(username,password,host,port):nngloballoggernnclient=Nonennsftp=Nonenntry:nnclient=paramiko.Transport((host,port))nnexceptExceptionaserror:nnlogger.error(error)nnelse:nntry:nnclient.connect(username=username,password=password)nnexceptExceptionaserror:nnlogger.error(error)nnelse:nnsftp=paramiko.SFTPClient.from_transport(client)nnreturnclient,sftp断开ftp连接

#断开连接nndefdisconnect(client):nngloballoggernntry:nnclient.close()nnexceptExceptionaserror:nnlogger.error(error)nnnndefcheck_local(localPath):nngloballoggernnifnotos.path.exists(localPath):nntry:nnos.mkdir(localPath)nnexceptIOErroraserr:nnlogger.error(err)从ftp服务器下载文件

#下载方法nndefdownLoad(client,sftp,remote,local):nngloballoggernn#检查远程文件nntry:nnresult=sftp.stat(remote)nnexceptIOErroraserr:nnerror='[ERROR%s]%s:%s'%(err.errno,os.path.basename(os.path.normpath(remote)),err.strerror)nnlogger.error(error)nnelse:nnifisdir(result.st_mode):nndirname=os.path.basename(os.path.normpath(remote))nnlocal=os.path.join(local,dirname)nn#local=local.replace("\\","/")nncheck_local(local)nnforfileinsftp.listdir(remote):nnsub_remote=os.path.join(remote,file)nnsub_remote=sub_remote.replace("\\","/")nndownLoad(client,sftp,sub_remote,local)nnelse:nnifos.path.isdir(local):nnlocal=os.path.join(local,os.path.basename(remote))nntry:nnsftp.get(remote,local)nnexceptIOErroraserr:nnlogger.error(err)nnelse:nnlogger.info('[get]%s%s%s',remote,'==>',local)nnlock.acquire()nnglobalfinishnnfinish+=1nnlock.release()nnlogger.info('已下载[%d]个文件',finish)压缩文件

#压缩文件nndefwriteAllFileToZip(absDir,zipFile):nngloballoggernnforfinos.listdir(absDir):nnabsFile=os.path.join(absDir,f)#子文件的绝对路径nnifos.path.isdir(absFile):#判断是文件夹,继续深度读取。nnzipFile.write(absFile)#在zip文件中创建文件夹nnlogger.info('写入%s到压缩包%s成功',absFile,zipFile.filename)nnwriteAllFileToZip(absFile,zipFile)#递归操作nnelse:#判断是普通文件,直接写到zip文件中。nnzipFile.write(absFile)nnlogger.info('写入%s到压缩包%s成功',absFile,zipFile.filename)nnreturn主方法(程序入口)

if__name__=="__main__":nn#日志nnlogging.basicConfig(level=logging.INFO,format='%(asctime)s-%(name)s-%(levelname)s-%(message)s')nnlogger=logging.getLogger()nnlogFormatter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')nnhandler=logging.FileHandler("log.txt")nnhandler.setLevel(logging.INFO)nnhandler.setFormatter(logFormatter)nnconsole=logging.StreamHandler()nnconsole.setLevel(logging.INFO)nnconsole.setFormatter(logFormatter)nnlogger.addHandler(handler)nn#logger.addHandler(console)nn#锁nnlock=threading.Lock()nn#条件nnfinish=0nn#读取配置文件nnconfigFile=open('config.json')nnconfigs=json.loads(configFile.read())nnconfigFile.close()nnnnlogger.info('工作目录:%s',configs['workDir'])nn#检查本地工作目录(父目录)nncheck_local(configs['workDir'])nnthreadList=[]nnforconfiginconfigs['threads']:nnlogger.info("=======================配置信息start=============================")nnlogger.info("HostAddress%s",config['HostAddress'])nnlogger.info('Port%s',config['Port'])nnlogger.info('Username%s',config['Username'])nnlogger.info('Password%s',config['Password'])nnlogger.info('RemotePath%s',config['RemotePath'])nnlogger.info('LocalPath%s',config['LocalPath'])nnlogger.info("=======================配置信息end=============================")nnclient,sftp=sftp_connect(config['Username'],config['Password'],config['HostAddress'],config['Port'])nn#创建本地目录nncheck_local(config['LocalPath'])nn#多线程nnt=threading.Thread(target=downLoad,args=(client,sftp,config['RemotePath'],config['LocalPath']))nnt.start()nnthreadList.append(t)nn#单线程nn#downLoad(client,sftp,config['RemotePath'],config['LocalPath'])nnfortinthreadList:nnt.join()nnnn#压缩nn#whilethreading.active_count()==1:nnlogger.info('=======================准备开始压缩==========================')nn#time.sleep(3)nnlogger.info('==========================开始压缩。。。==========================')nncheck_local(configs['zipDir'])nnzipFilePath=os.path.join(configs['zipDir'],configs['zipName']+'.zip')nnzipFile=zipfile.ZipFile(zipFilePath,'w',zipfile.ZIP_DEFLATED,allowZip64=True)nnabsZipFileDir=configs['workDir']nnwriteAllFileToZip(absZipFileDir,zipFile)nnlogger.info('==========================压缩完成==========================')nn#保留终端nnprint("PressEntertocontinue...")nninput()配置文件

{nn"workDir":"F:/temp",nn"zipDir":"F:/result",nn"zipName":"rrrr",nn"threads":[{nn"HostAddress":"10.7.5.69",nn"Port":22,nn"Username":"ftpuser",nn"Password":"ftpuser",nn"RemotePath":"/app/ftpuser/100_OrdMember_2019",nn"LocalPath":"F:/temp/1"nn},nn{nn"HostAddress":"10.7.5.69",nn"Port":22,nn"Username":"ftpuser",nn"Password":"ftpuser",nn"RemotePath":"/app/ftpuser/100_OrdMember_2019",nn"LocalPath":"F:/temp/2"nn},nn{nn"HostAddress":"10.7.5.69",nn"Port":22,nn"Username":"ftpuser",nn"Password":"ftpuser",nn"RemotePath":"/app/ftpuser/100_OrdMember_2019",nn"LocalPath":"F:/temp/3"nn}nn]nn}源码讲解

这里我们做的其实是一个Python脚本,像是shell脚本。程序入口在主方法,进入主方法后我们干了几件事:

声明日志,固定了日志输出的格式、日志等级和输出日志的目的地(日志文件和终端)。输出日志到日志文件用于保存日志,便于日后查看,输出到终端是让用户及时了解程序在做什么,做到什么程度了。

声明一个锁。这个所是为了下载文件计数,保证下载文件时,只有一个线程可以操作变量finish。

读取配置文件。想要开始执行,得先获取咱们的配置文件,让程序知道它连接那一台服务器,下载哪个目录下的文件到本地哪个目录,等等……

检查本地工作目录。为了减少用户配置的错误,避免他/她配了一个不存在的地址导致程序找不到目录而引发错误,所以我们要判断目录是否存在,是否需要创建目录。

根据配置文件threads中的配置,循环创建线程,完成读取本线程需要的配置文件、连接ftp、下载文件的操作。

压缩文件。拼接文件目录,保证压缩文件的目录关系不变,调用压缩文件方法。

美化结束动作,如果没有这一步,程序跑完就会关闭当前终端,导致用户无法了解程序是跑完了,还是中间出了问题关闭了。输出一段文字告诉用户可以按Enter来结束程序,并且用input()监听用户的输入,达到保留终端的效果。

2020-01-1913:35:33,253-root-INFO-工作目录:F:/tempn2020-01-1913:35:33,254-root-INFO-=======================配置信息start=============================n2020-01-1913:35:33,256-root-INFO-HostAddress10.7.5.69n2020-01-1913:35:33,257-root-INFO-Port22n2020-01-1913:35:33,258-root-INFO-Usernameftpusern2020-01-1913:35:33,259-root-INFO-Passwordftpusern2020-01-1913:35:33,260-root-INFO-RemotePath/app/ftpuser/100_OrdMember_2019n2020-01-1913:35:33,260-root-INFO-LocalPathF:/temp/1n2020-01-1913:35:33,261-root-INFO-=======================配置信息end=============================n2020-01-1913:35:33,290-paramiko.transport-INFO-Connected(version2.0,clientOpenSSH_5.5)n2020-01-1913:35:33,638-paramiko.transport-INFO-Authentication(password)successful!n2020-01-1913:35:33,656-paramiko.transport.sftp-INFO-[chan0]Openedsftpconnection(serverversion3)n2020-01-1913:35:33,659-root-INFO-=======================配置信息start=============================n2020-01-1913:35:33,660-root-INFO-HostAddress10.7.5.69n2020-01-1913:35:33,661-root-INFO-Port22n2020-01-1913:35:33,661-root-INFO-Usernameftpusern2020-01-1913:35:33,662-root-INFO-Passwordftpusern2020-01-1913:35:33,663-root-INFO-RemotePath/app/ftpuser/100_OrdMember_2019n2020-01-1913:35:33,664-root-INFO-LocalPathF:/temp/2n2020-01-1913:35:33,665-root-INFO-=======================配置信息end=============================n2020-01-1913:35:33,680-paramiko.transport-INFO-Connected(version2.0,clientOpenSSH_5.5)n2020-01-1913:35:33,987-root-INFO-[get]/app/ftpuser/100_OrdMember_2019/100_OrdMember_2019/100_OrdMember_2019222==>F:/temp/1\100_OrdMember_2019\100_OrdMember_2019\100_OrdMember_2019222n2020-01-1913:35:33,987-root-INFO-已下载[1]个文件n2020-01-1913:35:34,011-root-INFO-[get]/app/ftpuser/100_OrdMember_2019/100_OrdMember_2019/100_OrdMember_201922==>F:/temp/1\100_OrdMember_2019\100_OrdMember_2019\100_OrdMember_201922n2020-01-1913:35:34,012-root-INFO-已下载[2]个文件n2020-01-1913:35:34,032-paramiko.transport-INFO-Authentication(password)successful!n2020-01-1913:35:34,047-paramiko.transport.sftp-INFO-[chan0]Openedsftpconnection(serverversion3)n2020-01-1913:35:34,050-root-INFO-=======================配置信息start=============================n2020-01-1913:35:34,051-root-INFO-HostAddress10.7.5.69n2020-01-1913:35:34,052-root-INFO-Port22n2020-01-1913:35:34,052-root-INFO-Usernameftpusern2020-01-1913:35:34,053-root-INFO-Passwordftpusern2020-01-1913:35:34,054-root-INFO-RemotePath/app/ftpuser/100_OrdMember_2019n2020-01-1913:35:34,055-root-INFO-LocalPathF:/temp/3n2020-01-1913:35:34,056-root-INFO-=======================配置信息end=============================n2020-01-1913:35:34,060-root-INFO-[get]/app/ftpuser/100_OrdMember_2019/tmp001.xls==>F:/temp/1\100_OrdMember_2019\tmp001.xlsn2020-01-1913:35:34,071-root-INFO-已下载[3]个文件n2020-01-1913:35:34,072-paramiko.transport-INFO-Connected(version2.0,clientOpenSSH_5.5)n2020-01-1913:35:34,095-root-INFO-[get]/app/ftpuser/100_OrdMember_2019/100_OrdMember_2019111==>F:/temp/1\100_OrdMember_2019\100_OrdMember_2019111n2020-01-1913:35:34,096-root-INFO-已下载[4]个文件n2020-01-1913:35:34,118-root-INFO-[get]/app/ftpuser/100_OrdMember_2019/100_OrdMember_2019/100_OrdMember_2019222==>F:/temp/2\100_OrdMember_2019\100_OrdMember_2019\100_OrdMember_2019222n2020-01-1913:35:34,118-root-INFO-已下载[5]个文件n2020-01-1913:35:34,123-root-INFO-[get]/app/ftpuser/100_OrdMember_2019/100_OrdMember_201911==>F:/temp/1\100_OrdMember_2019\100_OrdMember_201911n2020-01-1913:35:34,124-root-INFO-已下载[6]个文件n2020-01-1913:35:34,258-root-INFO-[get]/app/ftpuser/100_OrdMember_2019/100_OrdMember_2019/100_OrdMember_201922==>F:/temp/2\100_OrdMember_2019\100_OrdMember_2019\100_OrdMember_201922n2020-01-1913:35:34,258-root-INFO-已下载[7]个文件n2020-01-1913:35:34,449-root-INFO-[get]/app/ftpuser/100_OrdMember_2019/tmp001.xls==>F:/temp/2\100_OrdMember_2019\tmp001.xlsn2020-01-1913:35:34,450-root-INFO-已下载[8]个文件n2020-01-1913:35:34,464-paramiko.transport-INFO-Authentication(password)successful!n2020-01-1913:35:34,479-root-INFO-[get]/app/ftpuser/100_OrdMember_2019/100_OrdMember_2019111==>F:/temp/2\100_OrdMember_2019\100_OrdMember_2019111n2020-01-1913:35:34,480-root-INFO-已下载[9]个文件n2020-01-1913:35:34,480-paramiko.transport.sftp-INFO-[chan0]Openedsftpconnection(serverversion3)n2020-01-1913:35:34,508-root-INFO-[get]/app/ftpuser/100_OrdMember_2019/100_OrdMember_201911==>F:/temp/2\100_OrdMember_2019\100_OrdMember_201911n2020-01-1913:35:34,509-root-INFO-已下载[10]个文件n2020-01-1913:35:34,552-root-INFO-[get]/app/ftpuser/100_OrdMember_2019/100_OrdMember_2019/100_OrdMember_2019222==>F:/temp/3\100_OrdMember_2019\100_OrdMember_2019\100_OrdMember_2019222n2020-01-1913:35:34,552-root-INFO-已下载[11]个文件n2020-01-1913:35:34,576-root-INFO-[get]/app/ftpuser/100_OrdMember_2019/100_OrdMember_2019/100_OrdMember_201922==>F:/temp/3\100_OrdMember_2019\100_OrdMember_2019\100_OrdMember_201922n2020-01-1913:35:34,576-root-INFO-已下载[12]个文件n2020-01-1913:35:34,624-root-INFO-[get]/app/ftpuser/100_OrdMember_2019/tmp001.xls==>F:/temp/3\100_OrdMember_2019\tmp001.xlsn2020-01-1913:35:34,624-root-INFO-已下载[13]个文件n2020-01-1913:35:34,649-root-INFO-[get]/app/ftpuser/100_OrdMember_2019/100_OrdMember_2019111==>F:/temp/3\100_OrdMember_2019\100_OrdMember_2019111n2020-01-1913:35:34,649-root-INFO-已下载[14]个文件n2020-01-1913:35:34,675-root-INFO-[get]/app/ftpuser/100_OrdMember_2019/100_OrdMember_201911==>F:/temp/3\100_OrdMember_2019\100_OrdMember_201911n2020-01-1913:35:34,675-root-INFO-已下载[15]个文件n2020-01-1913:35:34,677-root-INFO-=======================准备开始压缩==========================n2020-01-1913:35:34,678-root-INFO-==========================开始压缩。。。==========================n2020-01-1913:35:34,682-root-INFO-写入F:/temp\1到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,684-root-INFO-写入F:/temp\1\100_OrdMember_2019到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,686-root-INFO-写入F:/temp\1\100_OrdMember_2019\100_OrdMember_2019到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,696-root-INFO-写入F:/temp\1\100_OrdMember_2019\100_OrdMember_2019\100_OrdMember_201922到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,698-root-INFO-写入F:/temp\1\100_OrdMember_2019\100_OrdMember_2019\100_OrdMember_2019222到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,700-root-INFO-写入F:/temp\1\100_OrdMember_2019\100_OrdMember_201911到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,702-root-INFO-写入F:/temp\1\100_OrdMember_2019\100_OrdMember_2019111到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,716-root-INFO-写入F:/temp\1\100_OrdMember_2019\tmp001.xls到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,717-root-INFO-写入F:/temp\2到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,718-root-INFO-写入F:/temp\2\100_OrdMember_2019到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,720-root-INFO-写入F:/temp\2\100_OrdMember_2019\100_OrdMember_2019到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,723-root-INFO-写入F:/temp\2\100_OrdMember_2019\100_OrdMember_2019\100_OrdMember_201922到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,738-root-INFO-写入F:/temp\2\100_OrdMember_2019\100_OrdMember_2019\100_OrdMember_2019222到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,740-root-INFO-写入F:/temp\2\100_OrdMember_2019\100_OrdMember_201911到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,742-root-INFO-写入F:/temp\2\100_OrdMember_2019\100_OrdMember_2019111到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,745-root-INFO-写入F:/temp\2\100_OrdMember_2019\tmp001.xls到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,768-root-INFO-写入F:/temp\3到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,770-root-INFO-写入F:/temp\3\100_OrdMember_2019到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,772-root-INFO-写入F:/temp\3\100_OrdMember_2019\100_OrdMember_2019到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,774-root-INFO-写入F:/temp\3\100_OrdMember_2019\100_OrdMember_2019\100_OrdMember_201922到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,776-root-INFO-写入F:/temp\3\100_OrdMember_2019\100_OrdMember_2019\100_OrdMember_2019222到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,790-root-INFO-写入F:/temp\3\100_OrdMember_2019\100_OrdMember_201911到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,792-root-INFO-写入F:/temp\3\100_OrdMember_2019\100_OrdMember_2019111到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,794-root-INFO-写入F:/temp\3\100_OrdMember_2019\tmp001.xls到压缩包F:/result\rrrr.zip成功n2020-01-1913:35:34,794-root-INFO-==========================压缩完成==========================使用pyinstaller打包

pyinstaller-F-i.\downRecordFile.icorecoderFileDownload.py

使用Python32位pyinstaller出来的是运行于32位Windows操作系统的程序,Python64位则适用于64位Windows操作系统。

文章到此结束,如果本次分享的夹小玩具出门WRITEAS和带你用python写一个下载文件的小工具的问题解决了您的问题,那么我们由衷的感到高兴!



本文由欣欣吧手游攻略栏目发布,感谢您对欣欣吧的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“夹小玩具出门WRITEAS(带你用python写一个下载文件的小工具)

标签: