Python 如何对子流程输出进行字符串格式化?

Python 如何对子流程输出进行字符串格式化?,python,python-3.x,Python,Python 3.x,下面是我在Python中使用子流程模块的nslookup结果 b'Server:Server.internal\r\n地址:192.168.0.2\r\n\r\n名称: www.google.com\r\n地址:2404:6800:4007:800::2004\r\n\t 216.58.197.68\r\n\r\n' 请有人帮我把结果格式化如下 Server:Server.internal 名称:www.google.com 域名:192.168.0.2 地址:2404:6800:4007:8

下面是我在Python中使用
子流程
模块的nslookup结果

b'Server:Server.internal\r\n地址:192.168.0.2\r\n\r\n名称:
www.google.com\r\n地址:2404:6800:4007:800::2004\r\n\t
216.58.197.68\r\n\r\n'
请有人帮我把结果格式化如下

Server:Server.internal
名称:www.google.com
域名:192.168.0.2
地址:2404:6800:4007:800::2004216.58.197.68

您可以使用Python的
unicode\u escape
来帮助转换它。然后,可将结果分成几条线,并按如下方式重新组装:

nslookup = b'Server:  server.internal\r\nAddress:  192.168.0.2\r\n\r\nName: www.google.com\r\nAddresses:  2404:6800:4007:800::2004\r\n\t216.58.197.68\r\n\r\n'
lines = [line.strip('\t').replace('  ', ' ') for line in nslookup.decode('unicode_escape').splitlines()]
print('\n'.join([lines[0], lines[3], lines[1], '{} , {}'.format(lines[4], lines[5])]))
给你:

Server:Server.internal
名称:www.google.com
地址:192.168.0.2
地址:2404:6800:4007:800::2004216.58.197.68

地址:
可以由
DNS:
替换为最终的
.replace()

您可以将nslookup结果的行解析到字典中,然后使用它格式化输出

nslookup = (b'Server:  server.internal\r\nAddress:  192.168.0.2\r\n\r\n'
            b'Name: www.google.com\r\nAddresses:  2404:6800:4007:800::2004\r\n'
            b'\t216.58.197.68\r\n\r\n')

info = {}
for line in nslookup.decode().splitlines():
    tokens = line.split()
    if len(tokens) == 2:
        if tokens[0] == 'Addresses:':
            info.setdefault('Addresses', []).append(tokens[1])  # Without ":"
        else:
            info[tokens[0].rstrip(':')] = tokens[1]
    elif len(tokens) == 1:
        info['Addresses'].append(tokens[0])

info['Addresses'] = ', '.join(info['Addresses'])  # Format and convert to string.

print('''\
Server: {Server}
Name: {Name}
DNS:  {Address}
Addresses: {Addresses}'''.format(**info))
输出:

Server:Server.internal
名称:www.google.com
域名:192.168.0.2
地址:2404:6800:4007:800::2004216.58.197.68

使用
print
以换行方式打印。\n您必须先自己尝试。告诉我们你尝试了什么,什么不起作用。如果您在internet上查找几分钟,这不是一个难题。将
universalnewlines=True
传递到
子流程.Popen
(或类似的辅助函数,如
run
check\u output
,等等)。这将解决99%的问题(可能更多;粘贴的
bytes
literal无效,因此您可能添加了不存在的换行符)。