美文网首页Python小程序程序员
python3:u盘自动拷贝小程序(实用向)

python3:u盘自动拷贝小程序(实用向)

作者: 末一哟 | 来源:发表于2019-01-13 18:22 被阅读76次

    偶然间发现的别人做的小程序Python 骚操作,自动拷贝U盘,不过他写的比较简单,实用性太低,稍加改良得到了我这个版本,功能如下:
    1.打开程序后,自动读取是否有新设备载入;
    2.选择拷贝的文件类型,一键拷贝;
    3.拷贝完成后,继续监听
    4.对于同样的U盘(准确说是U盘内存储的内容没有变化),不做操作
    其实还可以添加一些简单的操作但是很实用,比如拷贝的路径、具体拷贝哪一个文件等等,这里主要就是想自己用起来方便一点,有时候需要这么一个一键拷贝pdf到电脑里的这么一个功能,路径什么的我给死了就免得我每次都要输入了不是吗?


    下面贴代码:

    import time
    import shutil
    from os.path import join,getsize
    import psutil
    import sys
    from win32gui import MessageBox as box
    SAVE = 'C:\\Users\\Administrator\\Desktop\\copy'
    
    local_device = []
    local_letter = []
    local_number = 0
    mobile_device = []
    mobile_letter = []
    mobile_number = 0
    
    def updata():
        global local_device,local_letter,local_number,\
        mobile_device,mobile_letter,mobile_number
        tmp_local_device,tmp_local_letter = [],[]
        tmp_mobile_device,tmp_mobile_letter = [],[]
        tmp_local_number,tmp_mobile_number = 0,0
    
        try:
            part = psutil.disk_partitions()
        except:
            print('程序发生异常')
            box(None,'抱歉,程序BUG了')
            sys.exit(-1)
        else:
            for i in range(len(part)):
                tmplist = part[i].opts.split(',')
                if tmplist[-1] == 'fixed':
                    tmp_local_number = tmp_local_number + 1
                    tmp_local_letter.append(part[i].device[:2])
                    tmp_local_device.append(part[i])
                else:
                    tmp_mobile_number = tmp_mobile_number + 1
                    tmp_mobile_letter.append(part[i].device[:2])
                    tmp_mobile_device.append(part[i])
            local_device,local_letter = tmp_local_device,tmp_local_letter
            mobile_device,mobile_letter = tmp_mobile_device,tmp_mobile_letter
            local_number,mobile_number = tmp_local_number,tmp_mobile_number
    
        return len(part)
    
    def print_device(n):
        global local_device,local_letter,local_number,\
        mobile_device,mobile_letter,mobile_number
        print('=' *50 +'\n读取到'+str(n)+'个驱动器')
        for l in range(local_number):
            print(local_letter[l],end="")
        print("{"+local_device[0].opts+"}")
    
        if(len(mobile_device)):
            for m in range(mobile_number):
                print(mobile_letter[m],end="")
            print("{"+mobile_device[0].opts+"}")
        else:
            None
    
        print("程序进入监听状态"+"*" *10)
        return 
    
    def detectUSB():
        for item in psutil.disk_partitions():
            if 'removable' in item.opts:
                driver,opts = item.device,item.opts
                print('发现usb驱动:',driver)
                break
        return driver
        
    def getdirsize(dir):
        size = 0 
        for root,dirs,files in os.walk(dir):
            size += sum([getsize(join(root,name))for name in files])
        print(size)
        return size
    
    def getallpath(dir):
        result = []
        for root,dirs,files in os.walk(dir):
            for filename in files:
                apath = os.path.join(root,filename)
                result.append(apath)
        return result
    
    def getOrderList(filelist,ordertype):
        filenames = []
        for file in filelist:
            fileinfo = os.path.splitext(file)
            if fileinfo[1] == ordertype:
                filenames.append(file)
        return filenames
        
    def main():
        old_dirsize = 0
        new_dirsize = 0
        now_number = 0
        old_number = updata()
        print_device(old_number)
        while(1):
            now_number = updata()
            if(now_number > old_number):
                print("检测到移动磁盘被插入...")
                print_device(now_number)
                box(None,"移动磁盘被插入\n","新插入磁盘",0)
                old_number = now_number
    
                usb = detectUSB()
                if len(usb)!=None:            
                    new_dirsize = getdirsize(usb)           
                    if old_dirsize != new_dirsize:
                        type = input('请输入要拷贝文件类型:')
                        filelist = getOrderList(getallpath(usb),type)
                        for filen in filelist:
                            print(filen)
                            file = filen.replace('\\','\\\\')
                            print(file)
                            if not os.path.exists(SAVE):
                                os.makedirs(SAVE)
                            if os.path.exists(SAVE):
                                shutil.copy(file,SAVE)
                        old_dirsize = new_dirsize
                        print('拷贝完毕')
                    else:
                        print('与之前磁盘相同')
    
            elif(now_number < old_number):
                print("检测到移动磁盘被拔出...")
                print_device(now_number)
                box(None,"移动磁盘被拔出\n","磁盘被拔出",0)
                old_number = now_number
            time.sleep(1)
                
    main()
    

    程序一个注释没有,主要是今天有点累,没啥动力,所以大家将就着看一下。不过个人感觉程序跑通了最重要,能运行了再去看代码,跟运行不了看代码,完全两个心情嘛!


    不过还是要做一些解释的:
    1.头文件psutil包用于检测驱动设备;shutil用于拷贝;MessageBox是借用win32的对话框弹出消息用的
    2.SAVE是我把拷贝的文件存储的地方;有人想问:那拷贝的源路径在哪?这个源路径是程序自动根据type找的,下面就能看到
    3.updata函数是用来统计当前计算机中的磁盘,目的当然是为了提示是否有新磁盘插入,很简单理解的,不需要多说
    4.print_device函数用来打印当前磁盘状态
    5.以上两个函数连在一起就可以记录计算机的新磁盘插入与否啦,可以理解吧?
    6.detectUSB函数用于找到新插入的磁盘,并给出该磁盘路径(也就是拷贝的源路径)
    7.getdirsize函数用来查询新插入的磁盘的大小,如果相同,说明肯定是同一个U盘且,他数据没有改动,那么用它来判断是否需要copy操作呀
    8.getallpath函数用来遍历U盘下的每一个文件
    9.getOrderList函数就是获取指定类型的文件啦,看main函数可知是与上8函数一同食用的,不难理解吧
    10.main主函数的逻辑是:检查是否有新设备插入,有的话,检测是否与上一个插入设备相同,如果相同,不作处理。如果不同,输入要拷贝的文件类型,然后程序自动执行拷贝工作。拷贝结束后,进入监听。


    给大家一些程序效果图,让大家心里有个底子:

    启动程序,进入监听 设备插入 输入拷贝文件类型 拷贝文件 (这里细心的朋友会发现,为什么每个pdf都有2个?其实是我在测试程序的时候,一不小心拷贝到源目录了,所以唉。。不过这里需要提醒大家一点,windows系统路径记得改成\双反斜杠,不然无法正确读取目录哦!) 拔出U盘 相同设备不进行操作
    (拔出U盘,恢复监听)

    另外,今天偶然看到把python程序打包做成exe的一个包:pyinstaller
    这不就相当于我把这个东西,做成了一个产品,可以给大家随便用了嘛!!!
    哈哈哈,虽然这个很low,但怎么说也是一个小进步吧。如果有人想要这个,也可以直接跟我要哦~


    我们没能力发现知识,我们只是知识的寄生虫

    相关文章

      网友评论

        本文标题:python3:u盘自动拷贝小程序(实用向)

        本文链接:https://www.haomeiwen.com/subject/hbkldqtx.html