Как преобразовать вывод команды 'df' в словарь? - PullRequest
0 голосов
/ 07 мая 2020

Мне нужно преобразовать вывод команды df в формат словаря python.

Filesystem     1K-blocks     Used Available Use% Mounted on
udev             1987884        0   1987884   0% /dev
tmpfs             402060     1992    400068   1% /run
tmpfs             402060     1992    400068   1% /run
/dev/sda6      113960124 37751712  70376476  35% /

Мой требуемый формат:

[{'Filesystem':udev, 'Used':0, 'Available':1987884 ,'Use%':0%, 'Mounted_On':'/dev'},{'Filesystem':udev, 'Used':0, 'Available':1987884 ,'Use%':0%, 'Mounted_On':'/dev'}]

Я пытался реализовать это:

path='df -h'
p = Popen(path, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
output = p.stdout.read().decode()  # from bytes to str
header, data, _*= output.split('\n')  # split to lines
header = header.replace('Mounted on', 'Mounted_on')  # fix a two word field
df = dict(list(zip(header.split(), data.split())))  # split to fields and combine
return df

Но он возвращает только первую строку:

{'Filesystem': 'udev', 'Size': '1.9G', 'Used': '0', 'Avail': '1.9G', 'Use%': '0%', 'Mounted_on': '/dev'}

Могу я узнать, какой код отсутствует. Думаю, в этом есть какие-то логические ошибки.

1 Ответ

1 голос
/ 07 мая 2020

Первая проблема здесь:

header, data, _= output.split('\n') 

Это распакует первую строку output в header, вторую в data, третью в _ - но у вас более 3 строк , и, скорее всего, вы хотите, чтобы все они (кроме заголовка) были в data, поэтому:

header, *data = output.splitlines()

Но это также требует изменения

df = dict(list(zip(header.split(), data.split()))) 

на

df = [ dict(zip(header.split(), datarow.split())) for datarow in data ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...