使用 Python 的 LDIF Parser 跳过一些属性并写入新的 LDIF 文件

如何解决使用 Python 的 LDIF Parser 跳过一些属性并写入新的 LDIF 文件

我正在使用 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=corp
modifyTimestamp: 20190905182416Z
modifiersName: cn=directory manager
owner: uid=hwuebker,ou=people,dc=corp
nsUniqueId: 4350c83d-1dd211b2-80a59250-3a51c428
uniqueMember: uid=anthonys,dc=corp
GroupType: Core
Application: AppUID
adminGroupAdmin: cn=IDM System Managers,dc=corp

# entry-id: 3
dn: uid=twalsh,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'  

如何在不做任何更改的情况下复制第 1 个和第 2 个条目的同时操作第 3 个条目?

解决方法

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

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

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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?