【问题标题】:How do I filter out data from a string in Python如何从 Python 中的字符串中过滤掉数据
【发布时间】:2018-08-06 17:56:29
【问题描述】:

我有一个程序通过 PowerShell 运行 WMI 查询并获取输出并将其存储在字符串中,然后打印出来。当我运行它时,我得到这个文本块。我可以找出我想要的值(名称、传感器类型和值)。但是里面还有很多其他的垃圾。

b'\r\n\r\n__GENUS : 2\r\n__CLASS : 传感器\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\ r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : Memory\r\nSensorType : Load\r\nValue : 40.99033\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\ n__CLASS : 传感器\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Core #2\r\nSensorType : Temperature\r\nValue : 62\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r \n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : 已用空间\r\n SensorType : Load\r\nValue : 92.39651\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Core #1\r\nSensorType : Temperature\r\nValue : 62\r\nPSComputerName : \ r\n\r\n__GENUS : 2\r\n__CLASS : 传感器\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r \n__NAMESPACE : \r\n__PATH : \r\nName : CPU DRAM\r\nSensorType : Power\r\nValue : 1.471058\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r \n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NA MESPACE : \r\n__PATH : \r\nName : CPU Core #2\r\nSensorType : Load\r\nValue : 55.46875\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\ r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Package\ r\nSensorType : Power\r\nValue : 12.19472\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\ n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : Bus Speed\r\nSensorType : Clock\r\nValue : 100.0001\r\nPSComputerName : \ r\n\r\n__GENUS : 2\r\n__CLASS : 传感器\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\ n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Total\r\nSensorType : Load\r\nValue : 51.5625\r\nPSComputerName : \ r\n\r\n__GENUS : 2\r\n__CLASS : 传感器\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r \n__NAMESPACE : \r\n__PATH : \r\nName : CPU 包\r\nSensorType : Temperature\r\nValue : 62\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r \n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Core #2 \r\nSensorType : Clock\r\nValue : 3100.004\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Se nsor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : 温度\r\nSensorType : Temperature\r\nValue : 34\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r \n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : Used Memory\r\nSensorType : Data\r\nValue : 3.240162\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : 传感器\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \ r\n__NAMESPACE : \r\n__PATH : \r\nName : 可用内存\r\nSensorType : Data\r\nValue : 4 .664536\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : { }\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Core #1\r\nSensorType : Clock\r\nValue : 3100.004\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : 传感器\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Cores\r\nSensorType : Power\r\nValue : 7.794704\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\n名称: CPU 显卡\r\nSensorType : 电源\r\n值 : 2.226472\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Core #1\r\nSensorType : Load\r\nValue : 47.65625 \r\nPSComputerName : \r\n\r\n\r\n\r\n'

这是 PowerShell 脚本,

function NSV(){
$computer = "LocalHost"
$namespace = "root\OpenHardwareMonitor"
$property1 = "Name"
$property2 = "SensorType"
$property3 = "Value"
Get-WmiObject -class Sensor -computername $computer -namespace $namespace -Property $property1,$property2,$property3
}

这里是 Python 脚本,

import subprocess
p = subprocess.Popen(["C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", ". \"./TestScript\";", "&NSV"], stdout=subprocess.PIPE)
(output, err) = p.communicate()
print (output)

我对这些东西很陌生,所以任何帮助都将不胜感激! :)

【问题讨论】:

  • 为什么不ConvertTo-Json PowerShell 中的输出?
  • 我不熟悉那个命令。我会在哪里实现我的 .ps1 上的那条线
  • 简单追加到Get-WmiObject .... | ConverTo-Json的末尾
  • 看起来很简单,我会试试的。谢谢

标签: python python-3.x powershell subprocess wmi-query


【解决方案1】:

你可以试试正则表达式,像这样:

import re

for match in re.finditer('SensorType', str(yourstring)):
    print("%s: %s" % (match.start(), match.group()))

这里是文档:https://docs.python.org/3/library/re.html

【讨论】:

    【解决方案2】:

    您可以将二进制文本放入字符串中,在换行符处拆分并过滤那些以您指定的内容开头的内容:

    import subprocess
    p = subprocess.Popen(["C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", ". \"./TestScript\";", "&NSV"], stdout=subprocess.PIPE)
    (output, err) = p.communicate()
    data = str(output) 
    
    # data =str(b'\r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : Memory\r\nSensorType : Load\r\nValue : 40.99033\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Core #2\r\nSensorType : Temperature\r\nValue : 62\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : Used Space\r\nSensorType : Load\r\nValue : 92.39651\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Core #1\r\nSensorType : Temperature\r\nValue : 62\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU DRAM\r\nSensorType : Power\r\nValue : 1.471058\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Core #2\r\nSensorType : Load\r\nValue : 55.46875\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Package\r\nSensorType : Power\r\nValue : 12.19472\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : Bus Speed\r\nSensorType : Clock\r\nValue : 100.0001\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Total\r\nSensorType : Load\r\nValue : 51.5625\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Package\r\nSensorType : Temperature\r\nValue : 62\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Core #2\r\nSensorType : Clock\r\nValue : 3100.004\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : Temperature\r\nSensorType : Temperature\r\nValue : 34\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : Used Memory\r\nSensorType : Data\r\nValue : 3.240162\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : Available Memory\r\nSensorType : Data\r\nValue : 4.664536\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Core #1\r\nSensorType : Clock\r\nValue : 3100.004\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Cores\r\nSensorType : Power\r\nValue : 7.794704\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Graphics\r\nSensorType : Power\r\nValue : 2.226472\r\nPSComputerName : \r\n\r\n__GENUS : 2\r\n__CLASS : Sensor\r\n__SUPERCLASS : \r\n__DYNASTY : \r\n__RELPATH : \r\n__PROPERTY_COUNT : 3\r\n__DERIVATION : {}\r\n__SERVER : \r\n__NAMESPACE : \r\n__PATH : \r\nName : CPU Core #1\r\nSensorType : Load\r\nValue : 47.65625\r\nPSComputerName : \r\n\r\n\r\n\r\n')
    
    whatIwant = ["Name","SensorType","Value"]
    d = [ q for q in data.split("\r\n") if any(q.startswith(k) for k in whatIwant)]
    # put every len(whatIwant ) items into one sublist
    step = len(whatIwant)
    dd = [d[i:i+step] for i in range(0,len(d),step)]
    for k in dd:
        print(k)
    

    输出:

    ['Name : Memory', 'SensorType : Load', 'Value : 40.99033']
    ['Name : CPU Core #2', 'SensorType : Temperature', 'Value : 62']
    ['Name : Used Space', 'SensorType : Load', 'Value : 92.39651']
    ['Name : CPU Core #1', 'SensorType : Temperature', 'Value : 62']
    ['Name : CPU DRAM', 'SensorType : Power', 'Value : 1.471058']
    ['Name : CPU Core #2', 'SensorType : Load', 'Value : 55.46875']
    ['Name : CPU Package', 'SensorType : Power', 'Value : 12.19472']
    ['Name : Bus Speed', 'SensorType : Clock', 'Value : 100.0001']
    ['Name : CPU Total', 'SensorType : Load', 'Value : 51.5625']
    ['Name : CPU Package', 'SensorType : Temperature', 'Value : 62']
    ['Name : CPU Core #2', 'SensorType : Clock', 'Value : 3100.004']
    ['Name : Temperature', 'SensorType : Temperature', 'Value : 34']
    ['Name : Used Memory', 'SensorType : Data', 'Value : 3.240162']
    ['Name : Available Memory', 'SensorType : Data', 'Value : 4.664536']
    ['Name : CPU Core #1', 'SensorType : Clock', 'Value : 3100.004']
    ['Name : CPU Cores', 'SensorType : Power', 'Value : 7.794704']
    ['Name : CPU Graphics', 'SensorType : Power', 'Value : 2.226472']
    ['Name : CPU Core #1', 'SensorType : Load', 'Value : 47.65625']
    

    【讨论】:

    • 感谢您的回复。但是有2个问题。 1. 每次运行程序时值都会发生变化。我如何使字符串成为输出变量。 2. 当我运行它时,我似乎没有收到任何错误,但是没有打印出来
    • @gman1230321 您在脚本中已经将字符串作为output...我重新编辑了您的代码。这不起作用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2014-04-28
    • 2016-02-19
    • 2018-09-11
    相关资源
    最近更新 更多