python - Python 中的命令输出解析

标签 python python-3.x

我正在尝试在 Windows 7 上编写一个 Python 脚本,它读取命令 ipconfig/displaydns 的输出并尝试从输出中获取一些值。

ipconfig/displaydns"的输出是这样的,

Windows IP Configuration

9.a.c.e.x-0.19-430f5091.531.1518.1b8d.2f4a.210.0.k1m2t5a3245k242qmfp75spjkv.avts.

Record Name . . . . . : 9.a.c.e.x-0.19-430f5091.531.1518.1b8d.2f4a.210.0.k1m2t5a3245k242qmfp75spjkv.avts.
Record Type . . . . . : 1
Time To Live  . . . . : 294
Data Length . . . . . : 4
Section . . . . . . . : Answer
A (Host) Record . . . : 127.0.0.16

我正在获取此输出并将其保存在如下变量中,

output = subprocess.check_output("ipconfig /displaydns", shell=True)

当我打印“输出”时,我得到以下内容

b'\r\nWindows IP Configuration\r\n\r\n   9.a.c.e.x-0.19-430f5091.531.1518.1b8d.2f4a.210.0.k1m2t5a3245k242qmfp75spjkv.avts.\r\n    ----------------------------------------\r\n    Record Name . . . . . : 9.a.c.e.x-0.19-430f5091.531.1518.1b8d.2f4a.210.0.k1m2t5a3245k242qmfp75spjkv.avts.\r\n    Record Type . . . . . : 1\r\n    Time To Live  . . . . : 289\r\n    Data Length . . . . . : 4\r\n    Section . . . . . . . : Answer\r\n    A (Host) Record . . . : 127.0 .0.16\r\n\r\n\r\n'

从这个输出中,我对 A (Host) RecordRecord Name 的值感兴趣,它们是 127.0.0.169.a.c.e.x-0.19-430f5091.531.1518.1b8d.2f4a.210.0.k1m2t5a3245k242qmfp75spjkv.avts。 分别。

我如何在 Python 中完成它?

最佳答案

import subprocess
output = subprocess.check_output("ipconfig /displaydns", shell=True)
result = {}
for row in output.split('\n'):
    if ': ' in row:
        key, value = row.split(': ')
        result[key.strip(' .')] = value.strip()

print(result)
print(result['A (Host) Record'])

给出:

{'A (Host) Record': '127.0 .0.16', 'Data Length': '4', 'Section': 'Answer', 'Record Name': '9.a.c.e.x-0.19-430f5091.531.1518.1b8d.2f4a.210.0.k1m2t5a3245k242qmfp75spjkv.avts.', 'Time To Live': '289', 'Record Type': '1'}
127.0 .0.16

另一个解决方案是: (当我在脑海中想到这个时,我认为它会更紧凑..它不是但无论如何,这是调用外部命令的不同方式,您可以在其中控制错误和输出(您可以区分两者))

import subprocess
cmdpipe = subprocess.Popen("ipconfig /displaydns", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
result = {}
for row in cmdpipe.stdout.readline():
    if ': ' in row:
        key, value = row.split(': ')
        result[key.strip(' .')] = value.strip()

# You need to close the file handles, as they will stay open "forever" otherwise.
cmdpipe.stdout.close()
cmdpipe.stderr.close()

print(result)
print(result['A (Host) Record'])

我还将添加使用 shell=True might be dangerous特别是与用户输入结合使用时。它确实添加了一些“隐藏的魔法”,使某些事情变得更容易或更自然。但在大多数情况下,您会希望改为执行 subprocess.Popen(["ipconfig", "/displaydns"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

关于python - Python 中的命令输出解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16175192/

相关文章:

未安装的 python 模拟和库

python - 将段落中句子的第一个单词大写

python - Pandas :.groupby().size() 和百分比

python - ValueError : No gradients provided for any variable while doing regression for integer values,,其中包括使用 keras 的底片

python - 如果它与列表中的项目匹配,则替换字符串中的项目

python - pytz.utc 和 dt.timezone.utc 有什么区别?

python - 通过子类化 `type` 类来实现类描述符

python - Django StreamingHttpResponse 没有设置正确的文件名

当 for 循环工作时,Python 多重处理不工作

python-3.x - 数据透视表中每个级别的小计