在python中从字符串或列表中提取列
我试图从python中的值字符串中提取列。值字符串如下所示-在python中从字符串或列表中提取列,python,python-2.7,Python,Python 2.7,我试图从python中的值字符串中提取列。值字符串如下所示- CN=Unix ADISID,OU=SA,OU=DGO,DC=dom,DC=ab,DC=com,1001 CN=1002--DS,OU=Process,DC=dom,DC=ab,DC=com,1002 CN=1003--Cyb,OU=SA,OU=DGO,DC=dom,DC=ab,DC=com,1003 CN=Doe--Joe,OU=Adm,DC=dom,DC=ab,DC=com,d1004 CN=cruise--bob,OU=SA,O
CN=Unix ADISID,OU=SA,OU=DGO,DC=dom,DC=ab,DC=com,1001
CN=1002--DS,OU=Process,DC=dom,DC=ab,DC=com,1002
CN=1003--Cyb,OU=SA,OU=DGO,DC=dom,DC=ab,DC=com,1003
CN=Doe--Joe,OU=Adm,DC=dom,DC=ab,DC=com,d1004
CN=cruise--bob,OU=SA,OU=DGO,DC=dom,DC=ab,DC=com,d1005
现在,我想从这个字符串中提取列标题为CN、OU1、OU2、DC1、DC2、DC3、ID的列。每行中OU和DC值的数量不同,因此如果它们不在一行中,我想将该列保留为空。另外,我正在使用下面的一段代码来生成上面的字符串
result = l.search_s(base, ldap.SCOPE_SUBTREE, criteria, attributes)
results=""
for i in [entry for dn, entry in result if isinstance(entry, dict)]:
results += str(i.get('distinguishedName')[0] +","+ i.get('sAMAccountName')[0] + "\n").replace("\, ","--")
print results
如果我以列表的形式创建结果会更容易吗?对于每一行:
pairs = [kv.split('=') for kv in line.split(',')]
for pair in pairs:
if len(pair) == 1:
pair.insert(0, 'ID')
现在你有了这样的东西:
[['CN', 'Unix ADISID'],
['OU', 'SA'],
['OU', 'DGO'],
['DC', 'dom'],
['DC', 'ab'],
['DC', 'com'],
['ID', '1001']]
然后:
这给了你:
{'CN': ['Unix ADISID'],
'DC': ['dom', 'ab', 'com'],
'ID': ['1001'],
'OU': ['SA', 'DGO']}
要获得“字段留空”行为,您必须计算每个字段的最大数量。我相信CN是独一无二的,所以它应该永远是1
result = l.search_s(base, ldap.SCOPE_SUBTREE, criteria, attributes)
users = []
for i in [entry for dn, entry in result if isinstance(entry, dict)]:
dn = i.get('distinguishedName')[0].replace('\, ', '--').split(',')
info = collections.defaultdict(list)
info['id'] = i.get('sAMAccountName')[0]
for part in dn:
key,value = part.split('=',1)
info[key].append(value)
users.append(info)
max_cn = max(map(lambda u: len(u['CN']), users))
assert max_cn == 1
max_ou = max(map(lambda u: len(u['OU']), users))
max_dn = max(map(lambda u: len(u['DN']), users))
numflds = max_cn + max_ou + max_dn
fields = []
for u in users:
f = [u['CN']]
ou = u['OU'] + [''] * max_ou
f.extend(ou[:max_ou])
dn = u['DN'] + [''] * max_dn
f.extend(dn[:max_dn])
f.append(u['id'])
你的预期产出是多少?您的问题似乎不够清楚。@Sаааааааааа如果您对该问题不清楚,请道歉。我想从字符串中的每一行提取列标题和相应的值。e、 g.从第一个类似CN、2 OU(OU1、OU2、OU3、OU4)、3 DC(DC1-DC4)和最后一个字段ID。由于OU3、OU4和DC4在第1行中没有值,它们的值应为空。希望这有意义?谢谢你的回复。我已尝试运行您提供的代码。但是获取一个错误
AttributeError:“list”对象在part.split('=',1)
行没有属性“split”
。我明白错误是什么,但不明白你想做什么。你能详细说明一下吗?我的错。我认为这是在创建一个嵌套的iterable。我修补了代码。如果我最后打印f,我只会得到最后一条记录。你能告诉我缺失的部分是什么吗?由你决定。要么在循环中打印f,要么将其附加到字段中,或者做其他事情。但是f每次通过都会被重置,所以你必须在循环中执行。工作起来很有魅力!。非常感谢。我没有资格投票给你的答案,但我肯定会给你+100:-)
result = l.search_s(base, ldap.SCOPE_SUBTREE, criteria, attributes)
users = []
for i in [entry for dn, entry in result if isinstance(entry, dict)]:
dn = i.get('distinguishedName')[0].replace('\, ', '--').split(',')
info = collections.defaultdict(list)
info['id'] = i.get('sAMAccountName')[0]
for part in dn:
key,value = part.split('=',1)
info[key].append(value)
users.append(info)
max_cn = max(map(lambda u: len(u['CN']), users))
assert max_cn == 1
max_ou = max(map(lambda u: len(u['OU']), users))
max_dn = max(map(lambda u: len(u['DN']), users))
numflds = max_cn + max_ou + max_dn
fields = []
for u in users:
f = [u['CN']]
ou = u['OU'] + [''] * max_ou
f.extend(ou[:max_ou])
dn = u['DN'] + [''] * max_dn
f.extend(dn[:max_dn])
f.append(u['id'])