我对Python比较新,正在尝试找到最适合Python的方法来解析来自LDAP查询的响应。到目前为止,我的工作还不错,但如果可能的话,我想把它弄得更整洁些。我的回答是:
"[[('CN=LName\\, FName,OU=MinorUserGroup,OU=MajorUserGroup,DC=my,DC=company,DC=com', {'department': ['theDepartment'], 'mail': ['theEmail@mycompany.com']})]]"
在这些数据中,我只对{}
中的字段感兴趣,这样我就可以把它扔进字典。。。在
我现在所做的感觉(和看起来)真的很暴力,但有效。我添加了额外的评论和输出结果,基于每一步都在做什么来尝试和阐述这个混乱。在
#Original String
#"[[('CN=LName\\, FName,OU=MinorUserGroup,OU=MajorUserGroup,DC=my,DC=company,DC=com', {'department': ['theDepartment'], 'mail': ['theEmail@mycompany.com']})]]"
#split at open {, take the latter half
myDetails = str(result_set[0]).split('{')
#myDetails[1] = ["'department': ['theDepartment'], 'mail': ['theEmail@mycompany.com']})]]"]
#split at close }, take the former half
myDetails = str(myDetails[1]).split('}')
#myDetails[0] = ["'department': ['theDepartment'], 'mail': ['theEmail@mycompany.com']"]
#split at comma to separate the two response fields
myDetails = str(myDetails[0]).split(',')
#myDetails = ["'department': ['theDepartment']","'mail': ['theEmail@mycompany.com']"]
#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:theEmail@mycompany.com"]
虽然我是“如果它没坏,就不要修理”的超级粉丝,但我更喜欢效率。在
编辑 根据@Mario下面接受的答案,这对我很有用
myUser = ast.literal_eval(str(result_set[0]))[0][1]
myUserDict = { k: v[0] for k, v in myUser.iteritems() }
信任您的输入并依赖其严格的规则性,这将解析示例数据并生成您期望的结果:
使用大括号的那一行叫做dict理解。在
编辑:此线程中的另一个用户建议使用
^{pr2}$ast.literal_eval
函数。我不得不同意,在研究了这个之后。eval
函数将执行任何字符串。如果输入是这样的,你会遇到一个大问题:另一方面,如果使用ast函数解析同一字符串,则会出现异常:
^{3}$进一步的讨论可以在这里找到:
http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html
本模块的文档如下:
https://docs.python.org/2/library/ast.html
考虑到这种用途ast.literal_评估虽然不完美,但确实更干净
相关问题 更多 >
编程相关推荐