我有一个看起来像
的文件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}
我失踪了吗?
答案 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'}