【问题标题】:Importing data from notepad to python dictionary将数据从记事本导入python字典
【发布时间】:2021-10-29 08:31:31
【问题描述】:

我有一个记事本,里面有这种风格的数据:

10.0.0.1 管理员管理员 10.0.0.2 管理员管理员 10.0.0.3 管理员管理员

我想从记事本中获取这些数据并将其导入 python 字典,其中键值将是 "ip":"10.0.0.1", "name":"admin","passwd":"admin" 通过循环,我会将这些关键值放入 netmiko 以逐个连接每个设备。但不知道如何将此数据从记事本转换为字典:(

当前代码:

desktop = "C:\\Users\\Dawid\\Desktop\\" 
with open(desktop+"devices.txt",'r') as file:
     x = file.read().split()
for i in x:     
    var = {
        'ip':i,
        'name':'admin',
        'passwd':'admin'
     }
    a = netmiko.ConnectHandler(**var)

【问题讨论】:

  • 你的整个记事本空间是分开的吗?
  • Tehre 是这样的格式: ip user password ip user password
  • 你尝试过什么吗?因为这看起来像是一个基本的文件加载。
  • @Mahrkeenerh 直到现在我只需要 ip,因为 login 和 passwd 是相同的,它看起来像这样:desktop = "C:\\Users\\Dawid\\Desktop\\" with open(desktop+"devices.txt",'r') as file: x = file.read().split() for i in x: var = { 'ip':i, 'name':'admin', 'passwd':'admin' } a = netmiko.ConnectHandler(**var) 但不知道如何修改它以获取 login 和 passwd 并导入它

标签: python python-3.x dictionary


【解决方案1】:

假设您的文件实际上是按照给定的那样分隔一行,而您真正想要的是一个字典列表,这里有一个选项。

np = "10.0.0.1 admin admin 10.0.0.2 admin admin 10.0.0.3 admin admin"
tokens = np.split()

dicts = []
while tokens:
    dicts.append({"pass": tokens.pop(), "user": tokens.pop(), "ip": tokens.pop()})

[print(d) for d in dicts]

屈服:

➜ python np.py
{'pass': 'admin', 'user': 'admin', 'ip': '10.0.0.3'}
{'pass': 'admin', 'user': 'admin', 'ip': '10.0.0.2'}
{'pass': 'admin', 'user': 'admin', 'ip': '10.0.0.1'}

【讨论】:

  • OP只是说每个block后面都有一个新行(ip、name、password)
  • split 实际上应该处理得很好。我刚刚检查过,它似乎工作正常。
【解决方案2】:

如何将文件读入 Python,然后将其拆分为一个列表,然后将每个列表项拆分为一个 dict: 添加了文本文件行中缺少名称和密码的可能性,只留下 IP 作为可用变量。

dir = r"C:\Users\username\Desktop\"

with open(fr"{dir}file.txt", "r") as f:
    a = f.read().splitlines()

a_list = [item.split(" ") for item in a]

for network in a_list:
    if len(network) != 3:
        network_dict = {"ip": network[0], "name": "default_name", "passwd": "default_password"}
    else:
        network_dict = {"ip": network[0], "name": network[1], "passwd": network[2]}
    #do whatever is needed with the dict here

如果您想将目录作为变量,请使用raw string

dir = r"C:\Users\username\Desktop\"

这样您就不必转义包括反斜杠在内的特殊字符。

【讨论】:

  • 像我想要的一样工作,非常感谢你:)
  • 顺便说一句,如果值不在记事本中,是否有任何选项可以将默认值分配给例如 name 和 passwd 键,然后将使用默认值?
  • @typovy 如果总是可能缺少名称和密码,则只需检查network 中是否只有1 个元素(在for network in a_list:) 内。如果它可能是名称或密码,然后它会变得有点复杂,因为你不知道缺少哪个。
  • 谢谢,我会设法弄明白的
猜你喜欢
  • 1970-01-01
  • 2020-11-21
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 2020-10-24
  • 1970-01-01
  • 2014-03-26
相关资源
最近更新 更多