【问题标题】:Use Python's LDIF Parser to skip some attributes and write to a new LDIF file使用 Python 的 LDIF Parser 跳过一些属性并写入新的 LDIF 文件
【发布时间】:2021-03-18 19:05:19
【问题描述】:

我正在使用 python LDIF 解析器 (link) 编辑一些属性并生成文件的修改版本。

我的 LDIF 文件是

# entry-id: 1
dn: cn=Directory Administrators, dc=organization,dc=corp
nsUniqueId: 2947f1b3-1dd211b2-80b89250-3a51c428
objectClass: top
objectClass: groupofuniquenames
cn: Directory Administrators
creatorsName: cn=directory manager
modifiersName: cn=directory manager
createTimestamp: 20151110180921Z
modifyTimestamp: 20151110180921Z

# entry-id: 2
dn: cn=214-All-Matrix-100342-ALXD,ou=groups,dc=organization,dc=corp
modifyTimestamp: 20190905182416Z
modifiersName: cn=directory manager
owner: uid=hwuebker,ou=people,dc=organization,dc=corp
nsUniqueId: 4350c83d-1dd211b2-80a59250-3a51c428
uniqueMember: uid=anthonys,ou=people,dc=organization,dc=corp
GroupType: Core
Application: AppUID
adminGroupAdmin: cn=IDM System Managers,ou=groups,dc=organization,dc=corp

# entry-id: 3
dn: uid=twalsh,ou=people,dc=organization,dc=corp
nsUniqueId: 3df58701-1dd211b2-80489250-3a51c428
modifyTimestamp: 20180606194655Z
modifiersName: cn=directory manager
initials: 1
Document: 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAAC
 AAAAAQAAAAAAAAAAEAAAAgAAAAIAAAD+////AAAAAAAAAACAAAAA////////////////////////
 /////////////////////////////////////////////////////////AAAAAA==
Document: RE  E-mail details .msg

到目前为止,我用于 LDIF 解析器的 Python 代码是

parser = MyLDIF(open(fileName, 'rb'), sys.stdout)
parser.parse()

#LDIF Parser go through records
for dn, entry in parser.parse():
    
        Doc = entry['Document']
        uidList= entry['uid']  
        uid = uidList[0]
        DocValue = Doc[0]
        DocSource = Doc[1]
    
        writer = LDIFWriter(open("data.ldif", "ab"))
        writer.unparse(dn, {
            "nsUniqueId": entry['nsUniqueId'],  
            "Docs": entry['Document'],

        })

由于第一个和第二个条目没有 DOCUMENT 属性,因此会引发错误。

Doc = entry['Document']
  KeyError: 'Document'  

如何在不做任何更改的情况下复制第一个和第二个条目来操作第三个条目?

【问题讨论】:

    标签: python python-3.x parsing ldap ldif


    【解决方案1】:

    您可以使用内置方法 get(key[,default]) 在字典中获取 key 的值,如果未设置 key,则可以使用 默认 值。

    我建议你在你的类中使用handle 方法来实现这一点,也可以直接写入输出文件(而不是写入标准输出并为输出文件创建另一个写入器,你仍然可以打印数据从句柄方法):

    class MyLDIF(LDIFParser):
       def __init__(self, input, output):
          LDIFParser.__init__(self, input)
          self.writer = LDIFWriter(output)
    
       def handle(self, dn, entry):
          if entry.get('Document', False):
              # modify entry if 'Document' is set
              entry['attribute1'] = 'value1'
              entry['attribute2'] = 'value2'
              # ...
          self.writer.unparse(dn, entry)
    
    parser = MyLDIF(open('data.ldif', 'r'), open('output.ldif', 'w'))
    parser.parse()
    

    【讨论】:

    • 嗨@EricLavault,谢谢。我尝试过使用get(key[,default]),它适用于我的代码writer.unparse。我尝试使用 `def handle(self, dn, entry)` 但没有任何内容打印到 output.ldif 文件中。我可能会遗漏一些东西。 P.S:我是编程新手。
    • 当调用parser.parse()时,handle方法会为输入文件中找到的每个条目调用(重要的一行是self.writer.unparse(dn, entry);写入输出),你需要定义这个MyLDIF 类中的方法。
    • 不知何故 handle 块没有得到执行。我试过def handle(self,dn,entry): print("testing block entry"),但没有打印出来。 :(
    • Mmmmh.. 可能是复制/粘贴代码后的缩进问题?仔细检查每个代码块中空格/制表符的数量。
    • 抱歉这么晚才回复。我在旅行。是的,我已经检查了缩进。对我来说似乎很好,但代码没有执行:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多