从由分号分隔的键值对文件生成字典

时间:2018-10-04 13:45:08

标签: python

我正在从文件中导入以下格式的数据:

username:password;username1:password1;username2:password2;

我需要将其导入字典并制作key = usernamevalue = password

到目前为止,我得到的是:

with open('file.txt') as f:
    password_list = dict(x.strip(":").split(";", 1) for x in f)


for user, password in password_list.items():
    print(user + " - " + password)

结果显示为username:password - username1:password1。所以我需要再次拆分它们。有什么提示吗?

2 个答案:

答案 0 :(得分:1)

您需要对拆分操作进行分层:

s = "username:password;username1:password1;username2:password2"

d = dict(v.split(":") for v in s.split(";"))

print(d)

结果:

{'username2': 'password2', 'username': 'password', 'username1': 'password1'}

对于多行文件,只需再添加一个循环:

d = dict(v.split(":") for s in f for v in s.strip().split(";"))

值得补充的是:

  • 如果密码包含;:,则这种格式是短暂的。使用csv模块和正确的引用可以解决该问题
  • 重复的用户名将被忽略:由于字典键的唯一性,仅考虑最后一个条目。
  • dict(v.split(":") ...)构造是一种无需字典即可理解的创建字典的旧方法,在这里特别有用,因为split返回的list恰好是 2个值(键/值)。

答案 1 :(得分:0)

您可以先分割为";"字符,然后将每个检索到的值分割为":"字符。

假设输入定义为此

input = "username:password;username1:password1;username2:password2;"

我们可以以此来创建字典

dict([entry.split(":", 1) for entry in input.split(";") if entry])

说明

首先,我们在每个username:password条目上进行分组

[entry for entry in input.split(";")]

然后我们检查是否没有空条目

[entry for entry in input.split(";") if entry]

然后,我们将每个条目拆分为第一个":"字符

[entry.split(":", 1) for entry in input.split(";") if entry]

最后我们把它放在字典里

dict([entry.split(":", 1) for entry in input.split(";") if entry])