解析命令输出Python

2024-10-03 11:23:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在运行一个实用程序来解析df命令的输出。我捕获输出并将其发送到解析器。下面是一个示例:

Filesystem                512-blocks      Used  Available Capacity iused      ifree %iused  Mounted on
/dev/disk2                1996082176 430874208 1564695968    22% 2429281 4292537998    0%   /
devfs                            668       668          0   100%    1156          0  100%   /dev
map -hosts                         0         0          0   100%       0          0  100%   /net
map auto_home                      0         0          0   100%       0          0  100%   /home

函数如下:

^{pr2}$

但是我得到了以下输出:

['/dev/disk2', '1996082176', '430876480', '1564693696', '22%', '2429288', '4292537991', '0%', '/']
['devfs', '668', '668', '0', '100%', '1156', '0', '100%', '/dev']
['map', '-hosts', '0', '0', '0', '100%', '0', '0', '100%', '/net']
['map', 'auto_home', '0', '0', '0', '100%', '0', '0', '100%', '/home']

问题是map -host应该是单个元素(对于Filesystem列)。 我尝试应用regex tokens = re.split(r'\s{2,}', line),但结果仍然不正确:

['/dev/disk2', '1996082176 430869352 1564700824', '22% 2429289 4292537990', '0%', '/']

解析输出的正确方法是什么?在


Tags: dev命令实用程序解析器示例mapdfhome
3条回答

因为FS可能会有多个空格,而且只要你能预先确定你可以使用不同的分隔符来拆分并最终组合它们。在

fs, rest = re.split(r'\s{2,}', line, 1)
result = [fs] + rest.split()

但这行不通的是fs被一个大的空格隔开。在

同意使用os.statvfs(path)是更好的工具的评论。df将是subprocess调用。在

只需在后面跟一个数字或/的一个或多个空格上拆分

>>> import re
>>> s = '''/dev/disk2                1996082176 430874208 1564695968    22% 2429281 4292537998    0%   /
devfs                            668       668          0   100%    1156          0  100%   /dev
map -hosts                         0         0          0   100%       0          0  100%   /net
map auto_home                      0         0          0   100%       0          0  100%   /home'''.splitlines()
>>> for line in s:
    print re.split(r'\s+(?=[\d/])', line)


['/dev/disk2', '1996082176', '430874208', '1564695968', '22%', '2429281', '4292537998', '0%', '/']
['devfs', '668', '668', '0', '100%', '1156', '0', '100%', '/dev']
['map -hosts', '0', '0', '0', '100%', '0', '0', '100%', '/net']
['map auto_home', '0', '0', '0', '100%', '0', '0', '100%', '/home']
>>> 

如果这是您想要的行为,我能看到的最简单的方法就是连接数组的第一个元素,直到到达一个数值元素。在

所以像这样:

tokens = line.split()
n = 1
while n < len(tokens) and not tokens[n].isdigit():
    n += 1
tokens[0] = ' '.join(tokens[:n])
tokens = [ tokens[0] ] + tokens[n:]

或者你可以试试@cricket_007的建议:

^{pr2}$

相关问题 更多 >