码上焚香

Yahocen

Python 自动检测U盘插入并将文件复制到指定目录

23
2024-05-10

我还记得在学习Java时,老师布置过一个作业,要求自动将插入U盘中的所有文件复制到指定目录。当时我对这个任务进行了改编,实现了将目录和文件都复制过去的功能。花了一个下午的时间,最终完成了这个任务,当时感到非常自豪。虽然我已经记不清具体的代码行数了,但今天我刚刚学完Python基础,现在想用Python来重新实现这个功能。

流程分析

  1. 获取当前盘符列表

  2. 检测新U盘的插入:循环检测盘符列表并和之前的盘符列表进行对比(它们之间的差集就是新U盘)

  3. 获取U盘目录列表

  4. 遍历目录列表

  5. 处理目录列表内文件和目录(如果是文件进行复制操作,如果是目录就再次进行第3步)

  6. 复制文件

用到的工具模块

  • 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行代码就完成了,当然这里并没有复制目录结构,只是复制了文件到指定目录(没有精力,太懒)。如果你需要复制目录结构,可以在此基础上进行改编,也是很简单的。