我是Python的新手,正在尝试找到最Pythonic的方式来解析LDAP查询的响应。到目前为止,我的作品仍然有效,但如果可能的话,我想使其更整洁。我的回复数据是这样的:
"[[('CN=LName\\, FName,OU=MinorUserGroup,OU=MajorUserGroup,DC=my,DC=company,DC=com', {'department': ['theDepartment'], 'mail': ['[email protected]']})]]"
从这些数据中,我真的只对内的字段感兴趣,{}
因此可以将其放入字典中。
"department:theDepartment,mail:[email protected]"
我现在正在做的事情感觉(看起来)确实很蛮力,但是行得通。我已经添加了额外的注释,并根据每个步骤在尝试详细说明此混乱的过程中输出了结果。
#Original String
#"[[('CN=LName\\, FName,OU=MinorUserGroup,OU=MajorUserGroup,DC=my,DC=company,DC=com', {'department': ['theDepartment'], 'mail': ['[email protected]']})]]"
#split at open {, take the latter half
myDetails = str(result_set[0]).split('{')
#myDetails[1] = ["'department': ['theDepartment'], 'mail': ['[email protected]']})]]"]
#split at close }, take the former half
myDetails = str(myDetails[1]).split('}')
#myDetails[0] = ["'department': ['theDepartment'], 'mail': ['[email protected]']"]
#split at comma to separate the two response fields
myDetails = str(myDetails[0]).split(',')
#myDetails = ["'department': ['theDepartment']","'mail': ['[email protected]']"]
#clean up the first response field
myDetails[0] = str(myDetails[0]).translate(None, "'").translate(None," [").translate(None,"]")
#myDetails[0] = ["department:theDepartment"]
#clean up the second response field
myDetails[1] = str(myDetails[1]).translate(None," '").translate(None, "'").translate(None,"[").translate(None,"]")
#myDetails[1] = ["mail:[email protected]"]
虽然我是“如果还没有破裂,请不要解决”的忠实拥护者,但我还是效率的忠实拥护者。
编辑这最终为我按照下面@Mario接受的答案为我工作
myUser = ast.literal_eval(str(result_set[0]))[0][1]
myUserDict = { k: v[0] for k, v in myUser.iteritems() }
信任您的输入并依靠其严格的规律性,这将解析您的示例数据并产生您所期望的结果:
import ast
ldapData = "[[('CN=LName\\, FName,OU=MinorUserGroup,OU=MajorUserGroup,DC=my,DC=company,DC=com', {'department': ['theDepartment'], 'mail': ['[email protected]']})]]"
# Using the ast module's function is much safer than using eval. (See below!)
obj = ast.literal_eval(ldapData)[0][0]
rawDict = obj[1]
data = { k: v[0] for k, v in rawDict.iteritems() }
# The dictionary.
print data
使用大括号的行称为dict理解。
编辑:此线程上的另一个用户建议使用该ast.literal_eval
功能。经过研究,我必须同意。该eval
函数将执行任何字符串。如果输入是这样的,那么您将有一个大问题:
eval("__import__('os').system('rm -R *')")
另一方面,如果使用ast函数解析了相同的字符串,则会出现异常:
>>> import ast
>>> ast.literal_eval("__import__('os').system('rm -R *')")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/ast.py", line 80, in literal_eval
return _convert(node_or_string)
File "/usr/lib64/python2.7/ast.py", line 79, in _convert
raise ValueError('malformed string')
ValueError: malformed string
>>>
进一步的讨论可以在这里找到:
http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html
该模块的文档在这里:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句