偶然间发现的别人做的小程序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,但怎么说也是一个小进步吧。如果有人想要这个,也可以直接跟我要哦~
网友评论