我有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中执行此操作的最佳方法是什么?
答案 0 :(得分:1)
要回答您的问题,不,您不能在同一词典中使用相同名称的不同键。但是,如果您仍按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:]))
答案 1 :(得分:0)
将会很接近这个:
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}
答案 2 :(得分:0)
也许您可以使用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')