使用Python';s LDIF解析器跳过某些属性并写入新的LDIF文件

使用Python';s LDIF解析器跳过某些属性并写入新的LDIF文件,python,python-3.x,parsing,ldap,ldif,Python,Python 3.x,Parsing,Ldap,Ldif,我正在使用python LDIF解析器() 编辑某些属性并生成文件的修改版本 我的LDIF文件是 # entry-id: 1 dn: cn=Directory Administrators, dc=organization,dc=corp nsUniqueId: 2947f1b3-1dd211b2-80b89250-3a51c428 objectClass: top objectClass: groupofuniquenames cn: Directory Administrators crea

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

我的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
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'],

        })
我的LDIF解析器的Python代码是

# 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
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'],

        })
由于第一个和第二个条目没有文档属性,因此会抛出一个错误

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

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

您可以使用内置方法获取字典中键的值,或者如果未设置键,则获取默认值

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


你好,埃里克拉沃,谢谢。我尝试过使用
get(key[,default])
,它与我的代码一起使用
writer.unpasse
。我尝试使用'def handle(self,dn,entry)`但没有任何内容被打印到output.ldif文件。我可能错过了什么。注:我对编程不熟悉。当调用
parser.parse()
时,输入文件中找到的每个条目都会调用
handle
方法(重要的一行是
self.writer.unpasse(dn,entry);
,它会写入输出),您需要在MyLDIF类中定义此方法。不知何故,
handle
块未被执行。我尝试了
def句柄(self,dn,entry):打印(“测试块条目”)
但没有打印出来:(Mmmmh..复制/粘贴代码后可能会出现缩进问题?请仔细检查每个代码块中的空格/制表符数。很抱歉这么晚才回复。我正在旅行。是的,我检查了缩进。对我来说似乎很好,但代码没有执行:(