python中ldap返回值的字符串分割



我的LDAP返回如下值

[('CN=b12345,OU=Accounts,DC=mydomain,DC=com', {'Fname': [Jose, Movi'], 'location': [b'London'], 'mail': [b'jose.movi@google.com'], 'title': [b'Sales -Exec -Retail']})]
[('CN=h12345,OU=Accounts,DC=mydomain,DC=com', {'Fname': [Lorraine, Moses'], 'location': [b'Boston'], 'mail': [b'Lorraine.Moses@google.com'], 'title': [b'Sales -ExecIII -Retail']})]
[('CN=o12345,OU=Accounts,DC=mydomain,DC=com', {'Fname': [Andy, Cameron'], 'location': [b'NewYork'], 'mail': [b'Andy.Cameron@google.com'], 'title': [b'Customer Support II - Fixed']})]

我想为每个条目拆分它们,并将它们打印为

DisplayName:Jose, Movi
Location:London
Email:jose.movi@google.com
Designation:Sales -Exec -Retail

提前向我道歉,因为我是python的初学者。

个人列表

当您定义x为:

x = [('CN=b12345,OU=Accounts,DC=mydomain,DC=com',
{'Fname': ['Jose, Movi'],
'location': [b'London'],
'mail': [b'jose.movi@google.com'],
'title': [b'Sales -Exec -Retail']})]

您可以以keyvalue方式打印:

for k, v in x[0][1].items():
try:
print(f"{k.title()}: {', '.join(a.decode('utf-8') for a in v)}")
except (UnicodeEncodeError, AttributeError):
# If you try to decode a regular string
print(f"{k.title()}: {', '.join(v)}")

输出
Fname: Jose, Movi
Location: London
Mail: jose.movi@google.com
Title: Sales -Exec -Retail

或者为每个key分配自定义值:

def printer(k, v):
try:
print(f"{k.title()}: {', '.join(a.decode('utf-8') for a in v)}")
except (UnicodeEncodeError, AttributeError):
# If you try to decode a regular string
print(f"{k.title()}: {', '.join(v)}")

for k, v in x[0][1].items():
if k == "Fname":
printer("DisplayName", v)
elif k == "mail":
printer("Email", v)
elif k == "title":
printer("Designation", v)
else:
printer(k, v)

输出:

Displayname: Jose, Movi
Location: London
Email: jose.movi@google.com
Designation: Sales -Exec -Retail

如果你使用>= Python3.10,你可以使用match语句自定义标题:

for k, v in x[0][1].items():
match k:
case "Fname":
printer("DisplayName", v)
case "mail":
printer("Email", v)
case "title":
printer("Designation", v)
case _:
# Default case
printer(k, v)

<<h3>所有列表/h3>当您定义x为:

x = [[('CN=b12345,OU=Accounts,DC=mydomain,DC=com',
{'Fname': ['Jose, Movi'],
'location': [b'London'],
'mail': [b'jose.movi@google.com'],
'title': [b'Sales -Exec -Retail']})],
[('CN=h12345,OU=Accounts,DC=mydomain,DC=com',
{'Fname': ['Lorraine, Moses'],
'location': [b'Boston'],
'mail': [b'Lorraine.Moses@google.com'],
'title': [b'Sales -ExecIII -Retail']})],
[('CN=o12345,OU=Accounts,DC=mydomain,DC=com',
{'Fname': ['Andy, Cameron'],
'location': [b'NewYork'],
'mail': [b'Andy.Cameron@google.com'],
'title': [b'Customer Support II - Fixed']})]]

你可以编辑你的例子在i的另一个for循环:

for i in x:
for k, v in i[0][1].items():
# Rest of method goes here

如果您严格使用单元素列表,您可以将', '.join(a.decode('utf-8') for a in v)更改为v.decode('utf-8')', '.join(v)v

当你有字典时@Freddy Mcloughlan的答案很好,如果数据来自文件,下面的答案可能有用。此外,它还使用了正则表达式,这总是一个很好的练习。

import re
file = open("test.file", "r", encoding="utf-8")
entry = file.readline()
while entry not in ["", " "]:
parsing = re.search(r"'Fname': [([^]]*)], 'location': [b'([^]]*)'], 'mail': [b'([^]]*)'], 'title': [b'([^]]*)']", entry)
name = parsing.group(1)
location = parsing.group(2)
mail = parsing.group(3)
designation = parsing.group(4)
print(name, location, mail, designation)
entry = file.readline()
file.close()

最新更新