是否有更好的方法使用python代码从输出中提取数据

时间:2012-06-22 07:08:01

标签: python

我正在编写一个新手python代码来查找系统上安装的软件列表,我将从中运行代码。如果没有安装软件,我打算向用户说明。

输出将是这样的:(dpkg -l)

A snippet below:
----------------

ii  git                                    1:1.7.9.5-1                             fast, scalable, distributed revision control system
ii  git-man                                1:1.7.9.5-1                             fast, scalable, distributed revision control system (manual pages)


c = subprocess.Popen(['dpkg','-l'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
list_of_packages,error = c.communicate()
for item in list_of_packages.split('\n'):
    print item.split('ii')[-1]

分裂,看起来我将不得不应用更多的分割来获得所需的数据。 git和1.7.9.5(版本名称)。

我只想弄清楚是否有更好的方法来实现这一目标。

请咨询..

谢谢, -Vijay

2 个答案:

答案 0 :(得分:6)

正如您所观察到的那样,尝试解析人类可读的输出是脆弱的。幸运的是,您可以使用dpkg -l替换为dpkg-query -W -f='${Package}\t${Version}\n',该dpkg-query用于生成机器可读输出。有关>>> args = ["dpkg-query", "-W", "-f=${Package}\t${Version}\n"] >>> out, err = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() >>> print out #output is summarized, clearly git 1:1.7.9.5-1 git-man 1:1.7.9.5-1 的完整选项列表,请参见http://manpages.ubuntu.com/manpages/lucid/man1/dpkg-query.1.html

{{1}}

答案 1 :(得分:0)

dpkg -l输出不包含ii的行。并且可能包含名称中包含ii的包。

我会这样做:

for item in list_of_packages.splitlines():
    if item.startswith('ii'):
        print item[4:]