在一个语句中将文件拆分为字典

时间:2018-02-14 17:03:53

标签: python

我有一个看起来像

的文件
device1.dev:manf:up
device2.dev:manf:up
device3.dev:manf:up
device4.dev:manf:up
device5.dev:manf:down

我正在尝试创建一个包含设备名称和状态的字典。在我的代码看起来像

        with open(r_file) as f:
            devices = (i.split(":")[0].split(".")[0] for i in f)

这让我得到了所有设备。我也可以轻松做到

with open(r_file) as f:
            devices = (i.split(":")[2] for i in f)

获取状态,但

devices = {i.split(":")[0].split(".")[0] for i in f:i.split(":")[2] for i in f}

返回无效语法。

有没有一种好方法可以实现

字典
{device1:up, device2:up, device3:up, device4:up, device5:down}

我失踪了吗?

5 个答案:

答案 0 :(得分:2)

根据您的示例数据和所需结果,这对我有用。

with open(r_file, 'r') as f:
    devices = {i.split('.', 1)[0]: i.rsplit(':', 1)[-1].strip() for i in f.readlines()}

请注意,使用rsplit()获取状态允许您从字符串的右端抓取您想要的内容。另外,我使用strip()删除换行符。

答案 1 :(得分:2)

我说要使用re.split()但请保持简单:

import re

with open(r_file) as source:
    devices = dict(re.split(r"\..*:", line.rstrip()) for line in source)

print(devices)

输出

% python3 test.py
{'device1': 'up', 'device2': 'up', 'device3': 'up', 'device4': 'up', 'device5': 'down'}
%

答案 2 :(得分:0)

在使用Python str.split之前,您可以通过将一个分隔符替换为另一个分隔符来拆分多个分隔符:

with open(r_file) as f:
    devices = dict(i.rstrip().replace('.', ':').split(':')[::3] for i in f)

或者您可以使用正则表达式(re module):

with open(r_file) as f:
    devices = dict(re.match('(.*)\..*:(.*)', i).groups() for i in f)

两者都返回:

{'device1': 'up',
 'device2': 'up',
 'device3': 'up',
 'device4': 'up',
 'device5': 'down'}

答案 3 :(得分:0)

re.search()函数的替代解决方案:

import re

with open(r_file) as f:
    pat = re.compile(r'^([^.]+).+?([^:]+)$')
    devices = dict(pat.search(r).groups() for r in f.read().splitlines())

print(devices)

输出:

{'device1': 'up', 'device2': 'up', 'device3': 'up', 'device4': 'up', 'device5': 'down'}

答案 4 :(得分:0)

您可以使用re

import re
final_data = dict([re.sub('\.[a-zA-Z:]+:', ' ', i).split() for i in open('filename.txt')])

输出:

{'device5': 'down', 'device4': 'up', 'device1': 'up', 'device3': 'up', 'device2': 'up'}