使用pytho解析outputsu6

2024-04-26 18:03:52 发布

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

我是一个python新手,在这里我正在与一些概念做斗争-任何帮助都是非常感谢的。在

我有一个定制的系统工具,它查询数据库,并返回几行作为要读取的结果——每行一行。下面的python脚本接受来自原始输入的站点FQDN并在该FQDN上运行$path。在

#!/usr/bin/python

import subprocess
import getpass

#get the site name.
site = raw_input("What is the name of the site?: ").strip()

#run path.
cmd = 'path '+ site;
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE);
path_output = p.stdout.read().strip().split('\n')

print path_output

返回如下结果:

^{pr2}$

我如何从“nfs=etc”中获取额外的空白,或者只获取第三列(aka awk'{print$3}')和/或从bash将这些结果的每一部分分配给单独的变量以进行进一步的操作?在

只是在学习过程中遇到了一些困难,我们衷心感谢您的帮助。在


Tags: thepathnameimportcmd概念output系统
2条回答

第二个问题首先:你可以把结果收集到一个列表中,但是用字典更方便。在

第一个问题:由于您的结果都是以key = value的形式出现的,您可以这样提取它们:

results = dict()
for line in p.stdout:
    key, value = line.split('=')
    results[key.strip()] = value.strip()

当像这样调用p.stdout(或任何文本文件对象)时,它一次隐式地读取一行。下一个语句将等号上的行拆分,并将部分分配给两个变量。最后,我们去除key和{}周围的空白,并将它们存储在字典中。在

你也可以用line.split()分割空白行,但是如果值或键(不太可能)包含一个嵌入的空格,你就会有问题。在

第三列将是line.split()[2];如果您想去掉前两个单词而使用其余的单词,则它是line.split(None, 2)[-1]。(split没有参数,或None作为第一个参数,在任何空白处拆分。)

>>> '    fqdn          = www.hcasc.info'.split()
['fqdn', '=', 'www.hcasc.info']

>>> for var, equals, rest in (l.split(None, 2) for l in path_output):
    assert equals == '='
    print var, 'is', rest

fqdn is www.hcasc.info
account_id is 525925
parent_id is 525925
nfs is /mnt/stor7-wc2-dfw1/525925/www.hcasc.info
server_type is PHP5
ssl is False
host_ip is 98.129.229.186
cgi_hosting is False
test_link_ip is 98.129.229.186
ipv6_ip is 2001:4800:7b02:100::1600:0

说明: (l.split(None, 2) for l in path_output)是一个生成器表达式,它对path_output的每个值运行l.split(None, 2)(称之为l)。这就像一个列表理解,这是相同的事情,但它的周围是[],而不是(),但它只在for循环经过时运行l.split调用,然后忽略前面的值,而列表理解将构造一个大列表,其中每个步骤的结果都是{},然后循环那张单子很正常。这就像在做什么

^{pr2}$

但稍微短一点。:)


如果你想把它放到字典中,比如DSM suggests,你可以这样做(只是为了上下文)如下

d = dict((var, rest) for var, equals, rest in (l.split(None, 2) for l in path_output))

或者,在python2.7/3中,更好的

d = { var: rest for var, equals, rest in (l.split(None, 2) for l in path_output) }

当然,您可以在两行代码中使其更具可读性:

output_vals = (l.split(None, 2) for l in path_output)
d = dict((var, rest) for var, equals, rest in output_vals)

你是想要一个字典还是仅仅是一个循环,这取决于你要用它做什么处理,但是字典对于大多数事情来说可能是一个更好的方法。在

相关问题 更多 >