简体   繁体   English

(Python)从目录或列表中提取特定单词?

[英](Python) extract certain word from directory or list?

I got a cool code can detect new USB plug-in, I want to extract idVendor and idProduct only, below is original function and my tried function.我有一个很酷的代码可以检测新的 USB 插件,我只想提取idVendoridProduct ,下面是原始的 function 和我试过的 function。

I read through the question How can I extract all values from a dictionary in Python?我通读了如何从 Python 中的字典中提取所有值的问题? before, but my situation seems slightly different.之前,但我的情况似乎略有不同。

  • original function原装 function
import time
from usb.core import find
from usb.util import get_string
import usb.backend.libusb1


def info_usb_device(dev):
    xdev = find(idVendor=dev.idVendor, idProduct=dev.idProduct)
    if xdev.bDeviceClass == 9:  # don't list HUBs, see [USB class-codes](https://www.usb.org/defined-class-codes)
        return
    if xdev._manufacturer is None:
        xdev._manufacturer = get_string(xdev, xdev.iManufacturer, langid=1033)
    if xdev._product is None:
        xdev._product = get_string(xdev, xdev.iProduct, langid=1033)
    device_info = '[%20s] %8d %9d %s - %s' % (xdev.serial_number, dev.idVendor, dev.idProduct,
                                 str(xdev._manufacturer).strip(),
                                 str(xdev._product).strip())
    return (xdev.serial_number, device_info)


def add_usb_devices(device_dict):
    new_devices = []
    for bus in usb.busses():
        for dev in bus.devices:
            if dev is None:
                continue
            serial_info = info_usb_device(dev)
            if serial_info is not None:
                (serial, info) = serial_info
                if serial not in device_dict:
                    new_devices.append(serial)
                    device_dict[serial] = info
    return new_devices


if __name__ == "__main__":
    device_dict = {}
    print('%22s %8s %9s %s' % ('serial', 'idVendor', 'idProduct', 'Manufacturer - Product'))
    print('-'*22, '-'*8,  '-'*9, '-'*30)
    # first scan
    add_usb_devices(device_dict)
    for device_info in device_dict.values():
        print(device_info)
    # next scans
    for i in range(5):  # run 5 more scans 
        new_serials = add_usb_devices(device_dict)
        if len(new_serials) > 0:
           print('** (scan %d) FOUND NEW USB DEVICES/SERIALS: %s' % (i, new_serials))
           for serial in new_serials:
               print(device_dict[serial])
        time.sleep(7)  # waiting 3 seconds before new scan
    print('Scans completed.')
  • output for all USB connection and new USB output 用于所有 USB 连接和新 USB
serial idVendor idProduct Manufacturer - Product
---------------------- -------- --------- ------------------------------
[                None]     1133     49271 Logitech - USB Optical Mouse  
[             2004888]     1423     37728  - USB Reader  
[    4234ICZMDJF5MWAK]    34148      4096 JetFlash - Mass Storage Device  
[5334354E373539325A315A4B]     5117      2112 Generic - External       
** (scan 2) FOUND NEW USB DEVICES/SERIALS: ['00000000000031']  
[      00000000000031]     4871       357 USBest Technology - USB Mass Storage Device  
Scans completed.
  • tried function(to extract idVendor and idProduct only) I tried to split and list device_dict[serial] and the list[1], list[2] could be the one I want but seems not correct.尝试过函数(仅提取idVendoridProduct ) 我尝试拆分并列出device_dict[serial]和 list[1],list[2] 可能是我想要的但似乎不正确。

import time
from usb.core import find
from usb.util import get_string
import usb.backend.libusb1
from dateutil import parser

def info_usb_device(dev):
    xdev = find(idVendor=dev.idVendor, idProduct=dev.idProduct)
    if xdev.bDeviceClass == 9:  # don't list HUBs, see [USB class-codes](https://www.usb.org/defined-class-codes)
        return
    if xdev._manufacturer is None:
        xdev._manufacturer = get_string(xdev, xdev.iManufacturer, langid=1033)
    if xdev._product is None:
        xdev._product = get_string(xdev, xdev.iProduct, langid=1033)
    device_info = '[%20s] %8d %9d %s - %s' % (xdev.serial_number, dev.idVendor, dev.idProduct,
                                 str(xdev._manufacturer).strip(),
                                 str(xdev._product).strip())
    return (xdev.serial_number, device_info)


def add_usb_devices(device_dict):
    new_devices = []
    for bus in usb.busses():
        for dev in bus.devices:
            if dev is None:
                continue
            serial_info = info_usb_device(dev)
            if serial_info is not None:
                (serial, info) = serial_info
                if serial not in device_dict:
                    new_devices.append(serial)
                    device_dict[serial] = info
    return new_devices


if __name__ == "__main__":
    device_dict = {}
    print('%22s %8s %9s %s' % ('serial', 'idVendor', 'idProduct', 'Manufacturer - Product'))
    print('-'*22, '-'*8,  '-'*9, '-'*30)
    # first scan
    add_usb_devices(device_dict)
    for device_info in device_dict.values():
        print(device_info)
    # next scans
    for i in range(5):  # run 5 more scans 
        new_serials = add_usb_devices(device_dict)
        if len(new_serials) > 0:
           print('** (scan %d) FOUND NEW USB DEVICES/SERIALS: %s' % (i, new_serials))
           for serial in new_serials:
               print(device_dict[serial])
        time.sleep(4)  # waiting 3 seconds before new scan
    
    str_device_dict_serial = {} 

    str_device_dict_serial = device_dict[serial]
    #splited_str_device_dict_serial= str_device_dict_serial.split(" ")
    
    #list_splited_str_device_dict_serial = list(splited_str_device_dict_serial)
    
    print('Scans completed.')


    print("+  +  +  +  +  +  +")
    print(device_dict[serial])
    print(type(device_dict[serial]))
    
  
    
    print("+ + + +")

    print(str_device_dict_serial)
    print(type(str_device_dict_serial))
  • regular expression string number only仅正则表达式字符串数字

import re重新进口
AAA = "[ 01DZTW5EXY5TSUF8] 34148 4096 JetFlash - Mass Storage Device" AAA = “[01DZTW5EXY5TSUF8] 34148 4096 JetFlash - 大容量存储设备”

BBB = re.findall(r'\b\d+\b', AAA) BBB = re.findall(r'\b\d+\b', AAA)

then use this concept with the string want to extract然后将此概念与要提取的字符串一起使用

  • solved code based on offered:基于提供的解决代码:

 import time from usb.core import find from usb.util import get_string import usb.backend.libusb1 import re def info_usb_device(dev): xdev = find(idVendor=dev.idVendor, idProduct=dev.idProduct) if xdev.bDeviceClass == 9: # don't list HUBs, see [USB class-codes](https://www.usb.org/defined-class-codes) return if xdev._manufacturer is None: xdev._manufacturer = get_string(xdev, xdev.iManufacturer, langid=1033) if xdev._product is None: xdev._product = get_string(xdev, xdev.iProduct, langid=1033) device_info = '[%20s] %8d %9d %s - %s' % (xdev.serial_number, dev.idVendor, dev.idProduct, str(xdev._manufacturer).strip(), str(xdev._product).strip()) return xdev.serial_number, device_info def add_usb_devices(device_dict): new_devices = [] for bus in usb.busses(): for dev in bus.devices: if dev is None: continue serial_info = info_usb_device(dev) if serial_info is not None: (serial, info) = serial_info if serial not in device_dict: new_devices.append(serial) device_dict[serial] = info return new_devices if __name__ == "__main__": device_dict = {} print('%22s %8s %9s %s' % ('serial', 'idVendor', 'idProduct', 'Manufacturer - Product')) print('-'*22, '-'*8, '-'*9, '-'*30) # first scan add_usb_devices(device_dict) for device_info in device_dict.values(): print(device_info) # next scans for i in range(5): # run 5 more scans new_serials = add_usb_devices(device_dict) if len(new_serials) > 0: print('** (scan %d) FOUND NEW USB DEVICES/SERIALS: %s' % (i, new_serials)) for serial in new_serials: print(device_dict[serial]) time.sleep(3) # waiting 3 seconds before new scan str_device_dict_serial = device_dict[serial] listed__device_dict_serial = re.findall(r'\b\d+\b', str_device_dict_serial) #splited_str_device_dict_serial= str_device_dict_serial.split(" ") print('Scans completed.') print("+ + + + + + + + + + + + +") print(str_device_dict_serial) print(type(str_device_dict_serial)) print("+ + + + + + + + + + + + +") print(device_dict[serial]) print(type(device_dict[serial])) print("+ + + + + + + + + + + + +") print(listed__device_dict_serial) print(type(listed__device_dict_serial))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM