Python3 多线程下载代码(4)

time.sleep( 1 )
        downloaded = 0
        while islive(tasks):                                                                                                #统计线程列表中各线程的状态,输出下载进度
            downloaded = sum( [task.downloaded for task in tasks] )
            if size > 0:
                process = downloaded/float(size)*100
                show = '\rFilesize:%d Downloaded:%d Completed:%.2f%%' % (size, downloaded, process)
            else:
                show = '\rDownloaded:%d ' % downloaded
            sys.stdout.write(show)
            sys.stdout.flush()
            time.sleep( 0.2 )
        endtime=time.time()                                                                                          #下载完成后停止计时
        consuming=Sec2Time(endtime-starttime)
        if size > 0:                                                                                                            #多线程下载的后续处理
            downloadsize = 0
            for i in filename:
                downloadsize += os.path.getsize(i)
            if downloadsize == size:
                show = '\rFilesize:%d Downloaded:%d Completed:%.2f%%\n' % (size, downloadsize,100)
            else:
                show = '\nSize is not mathed!\n'
                flag=False
        else:                                                                                                                  #单线程下载的后续处理
            show = '\nTotal Size: %d\n'% downloaded
        sys.stdout.write(show)
        sys.stdout.flush()
        if flag:                                                                                                                #确认下载的临时文件没问题后将各文件整合为最终的目标文件
            print('Integrating files...')
            num=1
            while os.path.exists(output):                                                                      #防止与本地已存在文件重名
                fname,fext=os.path.splitext(output)
                if '('+str(num-1)+')'+fext in output:
                    output = output.replace('('+str(num-1)+')'+fext,'('+str(num)+')'+fext)
                else:
                    fname += '('+str(num)+')'
                    output = fname+fext
                num +=1
            if len(filename) ==1 :                                                                                  #单线程下载的话,直接将下载的文件重命名为目标文件即可
                os.rename(filename[0], output)
            else:                                                                                                            #多线程临时文件整合
                filehandle = open( output, 'wb+' )
                for i in filename:
                    try:
                        f = open( i, 'rb' )
                        filehandle.write( f.read() )
                        f.close()
                        os.remove(i)
                    except Exception as ex:
                        print(ex)
                filehandle.close()
            if os.path.exists(output):
                print('Download Complete!')
            else:
                print('Failed to generate target file!')
                try:
                    #os.remove(output)
                    pass
                except:
                    pass
        else:
            for i in filename:
                try:
                    os.remove(i)
                    pass
                except:
                    pass
            print('Download Failed!')
            pass
        print('Consuming: {}\n'.format(consuming))                        #输出耗时
    else:
        print('Failed to retrieve resource information!')
        sys.exit()
def main(argv):                                                                                #处理传入参数,使用了getopt模块,另外有一个更强大的处理传入参数的模块optparse
    try:
        options,args=getopt.getopt(argv,'hu:f:n:p:',['help','url=','target=','num=','proxy='])
    except Exception as ex:
        print(ex)
        sys.exit()
    num = 2
    url,target,proxies= '','',''

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c95006b696c4660aeccfac93cfed50c6.html