Windows下Python自动在USB设备创建目录的脚本优化及报错解决问询
问题原因分析
你更新后代码报错的核心原因是调用Win32_DiskDrive返回的DeviceID是物理设备的底层访问路径,不是Windows系统挂载后可直接读写的盘符路径(比如I:\),操作系统不允许直接在物理设备路径下创建文件目录。
无硬编码实现方案
有两种符合你需求的实现,都不需要硬编码磁盘描述、盘符路径:
方案1:直接获取当前程序所在盘符(最适配你的场景)
因为你的程序本身就是存放在目标USB设备中运行的,直接读取当前执行文件的路径即可定位到所属USB盘符,无需调用WMI扫描磁盘,代码最简:
import os import sys # 兼容打包成EXE后的路径获取 if getattr(sys, 'frozen', False): # 打包为exe后运行的情况 current_exe_path = sys.executable else: # 直接运行py脚本的情况 current_exe_path = os.path.abspath(__file__) # 提取盘符 比如I:\ usb_root = os.path.splitdrive(current_exe_path)[0] + os.sep dir_name = "Backup" file_path = os.path.join(usb_root, dir_name) if not os.path.exists(file_path): os.makedirs(file_path) print(f"Folder created in ==> {usb_root}")
方案2:WMI自动识别所有USB可移动磁盘盘符(无需硬编码描述)
如果你需要主动扫描所有接入的USB可移动磁盘,不用硬编码Removable Disk、My Passport这类描述字段,可以通过DriveType字段判断:Win32_LogicalDisk的DriveType值为2时代表可移动磁盘,无需匹配描述文本:
import wmi import os c = wmi.WMI() def get_usb_disks(): usb_disks = [] for disk in c.Win32_LogicalDisk(): # DriveType=2 标准定义为可移动磁盘 无需匹配描述文本 if disk.DriveType == 2: usb_disks.append({ "description": disk.Description, "device_id": disk.DeviceID, "volume_name": disk.VolumeName }) return usb_disks # 取第一个识别到的USB磁盘 你也可以根据业务逻辑选择对应磁盘 usb_list = get_usb_disks() if not usb_list: print("未检测到可移动USB磁盘") exit() target_usb = usb_list[0] usb_root = target_usb['device_id'] + os.sep dir_name = "Backup" file_path = os.path.join(usb_root, dir_name) if not os.path.exists(file_path): os.makedirs(file_path) print(f"Folder created in ==> {target_usb}")
注意事项
- 如果你使用方案2同时接入了多个USB磁盘,可根据VolumeName等字段筛选你需要的目标磁盘,无需硬编码盘符
- 部分移动硬盘的DriveType可能被识别为3(本地磁盘),这种情况可以补充判断
InterfaceType == 'USB',关联Win32_DiskDrive和Win32_LogicalDisk的对应关系获取盘符即可,不需要直接用物理设备路径操作。
内容的提问来源于stack exchange,提问作者Pycoder
相关产品推荐
相关产品推荐

