Python小程序程序员

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

2019-01-13  本文已影响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,但怎么说也是一个小进步吧。如果有人想要这个,也可以直接跟我要哦~


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

上一篇下一篇

猜你喜欢

热点阅读