Python提取USB设备中Mass Storage Device信息的报错解决求助
提取USB设备中的Mass Storage Device条目解决方案
问题背景
需要遍历系统中所有USB设备,筛选出产品名称为"Mass Storage Device"的设备条目,并按指定格式输出。之前的代码因错误使用内置类型str导致TypeError,且未完成筛选逻辑。
报错原因分析
代码中if "Mass Storage Device" in str:这一行错误地将Python内置的字符串类型str当作变量使用,而str是不可迭代的类型,因此抛出argument of type 'type' is not iterable错误。同时,循环外引用循环内的dev、xdev变量会导致仅获取最后一个设备的信息,不符合需求。
修正后的完整代码
import usb.core import usb.backend.libusb1 def list_USB_all_info(): # 打印表头 print('idVendor idProduct Manufacturer - Product') busses = usb.busses() # 用于存储符合条件的设备条目 mass_storage_devices = [] for bus in busses: for dev in bus.devices: if dev: xdev = usb.core.find(idVendor=dev.idVendor, idProduct=dev.idProduct) # 获取制造商和产品名称,处理空值 manufacturer = usb.util.get_string(xdev, xdev.iManufacturer) if xdev._manufacturer is None else xdev._manufacturer product = usb.util.get_string(xdev, xdev.iProduct) if xdev._product is None else xdev._product # 格式化设备信息字符串 device_line = '%8d %9d %s - %s' % ( dev.idVendor, dev.idProduct, str(manufacturer).strip(), str(product).strip() ) # 打印所有设备信息 print(device_line) # 检查是否为目标设备,符合则加入列表 if "Mass Storage Device" in device_line: mass_storage_devices.append(device_line) # 输出分隔线和筛选结果 print("\n" + "="*20) if mass_storage_devices: for device in mass_storage_devices: print(f"(Mass Storage Device is : {device})") else: print("No Mass Storage Device found.") return mass_storage_devices # 执行函数 result = list_USB_all_info()
关键改进点
- 实时筛选:在遍历每个设备时直接检查设备信息字符串,无需先存储所有内容再二次处理,提升效率。
- 变量作用域修复:使用列表
mass_storage_devices收集所有符合条件的设备,避免循环外引用循环内变量导致的错误。 - 空值处理优化:简化制造商和产品名称的空值判断逻辑,代码更简洁。
- 友好提示:当没有找到目标设备时,输出明确提示信息。
预期输出示例
idVendor idProduct Manufacturer - Product 1133 49271 Logitech - USB Optical Mouse 1423 37728 - USB Reader 34148 4096 JetFlash - Mass Storage Device 7531 2 Linux 5.15.0-48-generic xhci-hcd - xHCI Host Controller 7531 3 Linux 5.15.0-48-generic xhci-hcd - xHCI Host Controller 5117 2112 Generic - External 7531 2 Linux 5.15.0-48-generic xhci-hcd - xHCI Host Controller 7531 3 Linux 5.15.0-48-generic xhci-hcd - xHCI Host Controller ==================== (Mass Storage Device is : 34148 4096 JetFlash - Mass Storage Device)
内容的提问来源于stack exchange,提问作者j ton
相关产品推荐
相关产品推荐

