Python 自动检测U盘插入并将文件复制到指定目录
编辑
25
2024-05-10
我还记得在学习Java时,老师布置过一个作业,要求自动将插入U盘中的所有文件复制到指定目录。当时我对这个任务进行了改编,实现了将目录和文件都复制过去的功能。花了一个下午的时间,最终完成了这个任务,当时感到非常自豪。虽然我已经记不清具体的代码行数了,但今天我刚刚学完Python基础,现在想用Python来重新实现这个功能。
流程分析
获取当前盘符列表
检测新U盘的插入:循环检测盘符列表并和之前的盘符列表进行对比(它们之间的差集就是新U盘)
获取U盘目录列表
遍历目录列表
处理目录列表内文件和目录(如果是文件进行复制操作,如果是目录就再次进行第3步)
复制文件
用到的工具模块
import psutil #一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息
import os #提供了非常丰富的方法用来处理文件和目录
import shutil #提供了许多关于文件和文件集合的高级操作,特别提供了支持文件复制和删除的功能
获取当前盘符
#运行时盘符列表
old_pans = psutil.disk_partitions()
检测新U盘插入我们使用while循环
#无限循环检测新盘插入
while True:
#实时盘符
now_pans = psutil.disk_partitions()
#获取当前盘于之前盘的差集
new_pans = list(set(now_pans).difference(set(old_pans)))
#差集长度大于0说明有新盘插入
if(0 < len(new_pans)):
#调用处理每一个新盘逻辑
for pan in new_pans:
#处理新盘 步骤3
handlePan(pan.device)
#查询结束当前盘等于之前盘
old_pans = now_pans
获取U盘目录列表
# 返回一个列表,其中包含在目录条目的名称
files = os.listdir(pan)
遍历目录列表处理目录列表内容(文件进行复制,目录就递归再次进行4遍历目录列表)
for f in files:
#跳过隐藏文件
if(f.startswith('.') or f == 'System Volume Information'):
pass
else:
filep = os.path.join(pan, f)
#判断是文件还是目录
if os.path.isdir(filep):
handlePan(filep)
else:
handleFile(pan, f)
复制文件
oldfile = os.path.join(dir, fir) #文件位置
newfile = os.path.join(datafile, fir) #新文件位置
shutil.copyfile(oldfile, newfile) #复制文件
完整代码
import psutil #一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息
import os #提供了非常丰富的方法用来处理文件和目录
import shutil #提供了许多关于文件和文件集合的高级操作,特别提供了支持文件复制和删除的功能
# sdiskpart(device='A:\\', mountpoint='A:\\', fstype='NTFS', opts='rw,fixed')
# ['$RECYCLE.BIN', 'System Volume Information', '口才学', '学习资料', '安装包']
datafile = 'E:\\test'
#支付文件到指定目录 dir文件目录 fir文件名称
def handleFile(dir, fir):
oldfile = os.path.join(dir, fir) #文件位置
newfile = os.path.join(datafile, fir) #新文件位置
shutil.copyfile(oldfile, newfile) #复制文件
#处理新盘
def handlePan(pan):
# 返回一个列表,其中包含在目录条目的名称
files = os.listdir(pan)
for f in files:
#跳过隐藏文件
if(f.startswith('.') or f == 'System Volume Information'):
pass
else:
filep = os.path.join(pan, f)
#判断是文件还是目录
if os.path.isdir(filep):
handlePan(filep)
else:
handleFile(pan, f)
#开始程序 检测新盘
def run():
#运行时盘符列表
old_pans = psutil.disk_partitions()
#无限循环检测新盘插入
while True:
#实时盘符
now_pans = psutil.disk_partitions()
#获取当前盘于之前盘的差集
new_pans = list(set(now_pans).difference(set(old_pans)))
#差集长度大于0说明有新盘插入
if(0 < len(new_pans)):
#调用处理每一个新盘逻辑
for pan in new_pans:
handlePan(pan.device)
#查询结束当前盘等于之前盘
old_pans = now_pans
run()
看起来你只用了不到50行代码就完成了,当然这里并没有复制目录结构,只是复制了文件到指定目录(没有精力,太懒)。如果你需要复制目录结构,可以在此基础上进行改编,也是很简单的。
- 0
- 0
-
赞助
支付宝微信 -
分享