首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(Python)从打印字符串中提取一行数据

(Python)从打印字符串中提取一行数据
EN

Stack Overflow用户
提问于 2022-10-06 02:00:56
回答 1查看 73关注 0票数 -1

现在我列出所有usb的信息,只想提取特定的信息,“大容量存储设备”

我的预期输出是:

代码语言:javascript
复制
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)

我的研究表明,我可以使用regular expression和re.findall提取数据,或者从这里使用if。

Python regex to match a specific word if <keyword> in str: print('that line')

我正在整理打印字符串,并正确地打印出预期的行,尝试代码如下:(尝试使用if条件)

代码语言:javascript
复制
import usb.core
import usb.backend.libusb1
import re

def list_USB_all_info():
    print ( 'idVendor  idProduct  Manufacturer - Product')
    

    busses = usb.busses()
    for bus in busses:
        for dev in bus.devices:
            if dev:
                xdev = usb.core.find(idVendor=dev.idVendor, idProduct=dev.idProduct)
                if xdev._manufacturer is None:
                    xdev._manufacturer = usb.util.get_string(xdev, xdev.iManufacturer)
                if xdev._product is None:
                    xdev._product = usb.util.get_string(xdev, xdev.iProduct)
                print ('%8d  %9d  %s - %s' % (dev.idVendor, dev.idProduct,
                                            str(xdev._manufacturer).strip(),
                                            str(xdev._product).strip()))
    
    if "Mass Storage Device" in str:
        print('that Mass Storage Device line info')
    
    list_certain_data = "Mass Storage Device is  : "
    list_Mass_Storage_Device = (str(dev.idVendor) + "  "+ str(dev.idProduct)+ "  |  "+str(xdev._manufacturer)+ "  |  "+str(xdev._product))
    
    return list_certain_data, list_Mass_Storage_Device

result = list_USB_all_info()

print(result)

输出

代码语言:javascript
复制
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
Traceback (most recent call last):
  File "/home/joy/fe_dir/10_6_list_idvender_idProduct.py", line 34, in <module>
    result = list_USB_all_info()
  File "/home/joy/fe_dir/10_6_list_idvender_idProduct.py", line 26, in list_USB_all_info
    if "Mass Storage Device" in str:
TypeError: argument of type 'type' is not iterable

我自己也是这样做的,我可以先将所有输出结果保存在"all_in_string“中,然后将其保存为split(),然后保存用于回答的正则表达式

代码语言:javascript
复制
import usb.core
import usb.backend.libusb1


def list_USB_all_info():
    print ( 'idVendor  idProduct  Manufacturer - Product')
    
    busses = usb.busses()
    
    all_in_string = ' '
    for bus in busses:
        for dev in bus.devices:
            if dev:
                xdev = usb.core.find(idVendor=dev.idVendor, idProduct=dev.idProduct)
                if xdev._manufacturer is None:
                    xdev._manufacturer = usb.util.get_string(xdev, xdev.iManufacturer)
                if xdev._product is None:
                    xdev._product = usb.util.get_string(xdev, xdev.iProduct)
                print ('%8d  %9d  %s - %s' % (dev.idVendor, dev.idProduct,
                                            str(xdev._manufacturer).strip(),
                                            str(xdev._product).strip()))
                                            
                A = ('%8d  %9d  %s - %s' % (dev.idVendor, dev.idProduct,
                                            str(xdev._manufacturer).strip(),
                                            str(xdev._product).strip()))
       
                all_in_string += A  + "/end/"+"\n" 
                         
    print ("= = = =")
    
    #if "Mass Storage Device" in str:
    #   print('that Mass Storage Device line info')
    
    #list_certain_data = "Mass Storage Device is  : "
    #list_Mass_Storage_Device = (str(dev.idVendor) + "  "+ str(dev.idProduct)+ "  |  "+str(xdev._manufacturer)+ "  |  "+str(xdev._product))
    
    return all_in_string

result = list_USB_all_info()

print(result)
EN

回答 1

Stack Overflow用户

发布于 2022-10-06 04:09:09

我来到下面:

代码语言:javascript
复制
import usb.core
import usb.backend.libusb1

def list_USB_all_info():
    print ( 'idVendor  idProduct  Manufacturer - Product')
    
    busses = usb.busses()
    
    all_in_string = ' '
    for bus in busses:
        for dev in bus.devices:
            if dev:
                xdev = usb.core.find(idVendor=dev.idVendor, idProduct=dev.idProduct)
                if xdev._manufacturer is None:
                    xdev._manufacturer = usb.util.get_string(xdev, xdev.iManufacturer)
                if xdev._product is None:
                    xdev._product = usb.util.get_string(xdev, xdev.iProduct)
                print ('%8d  %9d  %s - %s' % (dev.idVendor, dev.idProduct,
                                            str(xdev._manufacturer).strip(),
                                            str(xdev._product).strip()))
                                            
                A = ('%8d  %9d  %s - %s' % (dev.idVendor, dev.idProduct,
                                            str(xdev._manufacturer).strip(),
                                            str(xdev._product).strip()))
       
                all_in_string += A  + "/end/"+"\n" 
                all_in_string_splited = all_in_string.split("/end/")
                         
  

    print ("= = = =")
    all_in_string_match_Mass_Storage_Device = [s for s in all_in_string_splited if "Mass Storage Device" in s]
       
    return all_in_string_match_Mass_Storage_Device

result = list_USB_all_info()

print(result)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73967969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档