Я хочу использовать python3 для анализа вывода "command> systeminfo" в json - PullRequest
0 голосов
/ 21 сентября 2018

Я хочу превратить вывод команды systeminfo в json.Но мне нужна только определенная информация.И я должен избегать первой строки (командной строки), она не всегда в строке 1.

Как я могу добиться этого с помощью python3?

Я сохраняю вывод в файл .txt.Ниже представлен сегмент вывода.

C:\Users\user\Desktop>systeminfo
Host Name:                 COMPUTERHOPE
OS Name:                   Microsoft Windows 10 Pro
OS Version:                10.0.10586 N/A Build 10586
OS Manufacturer:           Microsoft Corporation
OS Configuration:          Standalone Workstation
OS Build Type:             Multiprocessor Free
Registered Owner:          Computerhope
Registered Organization:   Computer Hope
Product ID:                00000-00000-00000-AAAAA
Original Install Date:     12/17/2015, 7:09:50 PM
System Boot Time:          3/28/2016, 6:57:39 AM
System Manufacturer:       Dell Inc.
System Model:              XPS 8300
System Type:               x64-based PC
Processor(s):              1 Processor(s) Installed.
                           [01]: Intel64 Family 6 Model 42 Stepping 7 Genuine Intel ~3401

Я хочу, чтобы это было так.

{
    "Host Name": "COMPUTERHOPE",
    "OS Name": "Microsoft Windows 10 Pro",
    "OS Version": "10.0.10586 N/A Build 10586",
    "Original Install Date": 
    {
     "Date": "12/17/2015",
     "Time": "7:09:50 PM",
    }
}

1 Ответ

0 голосов
/ 21 сентября 2018
import json, subprocess

def get_systeminfo():
    # Command to run.
    command = ['systeminfo']

    # Run the commands and get the stdout.
    with subprocess.Popen(command, universal_newlines=True, stdout=subprocess.PIPE) as p:
        stdout, _ = p.communicate()

    return stdout


def dic_from_systeminfo(stdout):
    # Dic to store all info.
    dic = {}

    # Previous key name saved to reuse for dic values.
    prevkey = ''

    # Loop through each line of stdout and split by colon.
    for line in stdout.splitlines():
        key, sep, value = line.partition(':')

        if sep == ':':
            value = value.strip()

            if not key.startswith(' '):
                # Assign these keys with values of type dic.
                if key in ('Original Install Date', 'System Boot Time'):
                    value = {k: v.strip() for k, v in zip(('Date', 'Time'), value.split(','))}
                elif key in ('Processor(s)', 'Hotfix(s)', 'Network Card(s)'):
                    value = dict()

                # Add to dic and save key name.
                dic[key] = value
                prevkey = key
            else:
                # Remove [] characters and then add key and value to the value type dic.
                key = key.strip().replace('[', '').replace(']', '')

                if prevkey and isinstance(dic[prevkey], dict):
                    dic[prevkey][key] = value
                else:
                    print('Warning:', 'dic[' + prevkey + '] is not a dict value.')

    return dic

# Run Systeminfo and get stdout.
stdout = get_systeminfo()

# Get dic from stdout (or read file content).
dic = dic_from_systeminfo(stdout)

# Write the dic to file.
if dic:
    with open('systeminfo.json', 'w', encoding='utf-8') as w:
        json.dump(dic, w, indent=4)

Сценарий выполняет команду systeminfo и получает стандартный вывод.

Стандартный вывод обрабатывается построчно в цикле for, а затем разделяется на ключ и значение с помощью str.partition method.

Если имя ключа не начинается с пробела, то это корневой ключ.Если оно совпадает с одним из имен специальных ключей, ему будет присвоено значение типа словаря, иначе будет установлено текущее значение.Имя ключа сохраняется в prevkey, так что если сработало условие else, prevkey может использоваться в качестве корневого ключа, а ключ и значение будут установлены в этот корневой ключ.

Квадратные скобкиудаляются из ключей в состоянии else, хотя это можно считать необязательным предпочтением.

Если dic является чем-то, то оно будет записано в systeminfo.json.

Есливам нужны только определенные ключи, тогда вы можете сохранить интересующие вас ключи в отдельном словаре и записать их в файл.


В качестве основного кода для чтения из существующего файла используйте:

stdout = ''

# Read from existing file.
with open('sysinfo.txt') as r:
    stdout = r.read()

# Get dic from stdout (or read file content).
dic = dic_from_systeminfo(stdout)

# Write the dic to file.
if dic:
    with open('systeminfo.json', 'w', encoding='utf-8') as w:
        json.dump(dic, w, indent=4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...