Как создать словарь путем перебора списка с одним и тем же ключом и несколькими значениями? - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть вывод команды df для проверки моей файловой системы.Я получил его от os.command, а затем добавил его в список.Теперь я пишу построчно и хочу создать словарь, так как мне нужно отправить ответ как json позже.

Filesystem          Size  Used Avail Use% Mounted on
/dev/xxxx/yyy       9.8G  3.2G  6.1G  35% /
tmpfs               32G     0   32G   0% /dev/shm
/dev/sss            247M  106M  129M  46% /boot
/dev/aaa/ccc        1.5G  205M  1.2G  15% /home
/dev/bbb/ddd        2.2G  152M  2.0G   8% /opt

Как я хочу это:

{
Filesystem:/dev/xxxx/yyy
{ 
Size: 9.8G
Used:
Avail:
Use%:
Mounted on:
}
Filesystem:tmpfs
{ 
Size: 
Used:
Avail:
Use%:
Mounted on:
}
Filesystem:/dev/sss
{ 
Size: 
Used:
Avail:
Use%:
Mounted on:
}
}

Мой кодна данный момент:

output = os.popen('df -Ph')
df_contents=output.readlines()
for line in df_contents:
    print(line)

Я хочу понять, возможно ли это, так как у меня один и тот же ключ с разными значениями, и если да, каков наилучший способ сделать это в python?

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Может быть, вы можете пойти с compat и df.to_json

import pandas as pd
from pandas.compat import StringIO
df_contents = pd.read_csv(StringIO(output.read()), sep = '\t')
df_contents.to_json(orient='table')
0 голосов
/ 05 декабря 2018

Чтобы ответить на ваш вопрос, нет, вы не можете иметь разные ключи с одним и тем же именем в одном словаре.Однако, если вы все-таки группируете все по FileSystem, вы можете просто иметь ключи своего словаря в качестве значений FileSystem, и в этом случае ваш словарь будет выглядеть так:

{ '/dev/xxxx/yyy': {'Size': '9.8G', 'Used': '3.2G', ... }
  'tmpfs: {'Size': '32G', 'Used': '0', ... }
   ... and so on.
}

Предполагая, чтокаждая строка в df_contents содержит данные, разделенные пробелами (и не обязательно табуляцией), и в самих значениях нет пробелов, тогда вы можете просто использовать .split(), чтобы разбить каждую строку.

var_keys = ['Size', 'Used', 'Avail', 'Use%', 'Mounted on']
mydict = {}
for line in df_contents:
    # This next command breaks the line into a list, 
    # like ['/dev/xxxx/yyy', '9.8G', '3.2G', '6.1G', '35%', '/']
    values = line.split()
    mydict[values[0]] = dict(zip(var_keys, values[1:]))
0 голосов
/ 05 декабря 2018

Должно быть что-то очень близкое к этому:

headers = [
  'Size',
  'Used',
  'Avail',
  'Use%',
  'Mounted',
]

lines = [line.strip().split() for line in df_contents if line.strip()]

{line[0]: dict(zip(headers, line[1:])) for line in lines}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...