如何使用Python的ldif模块解析LDIF文件并删除指定DN后导出新文件
实现LDIF文件指定DN过滤的实现方案
核心思路
整体流程分为三步:读取LDIF文件条目、过滤需要删除的DN、将保留的条目写入新文件,直接用Python的python-ldap库自带的LDIFParser和LDIFWriter即可实现,不需要额外依赖。
具体实现步骤
- 首先安装依赖:
pip install python-ldap,Windows环境如果安装失败可以直接下载对应版本的预编译whl包安装 - 定义需要删除的DN列表,或者写自定义过滤规则(比如匹配特定ou、特定uid前缀都可以)
- 继承
LDIFParser类重写处理方法,每读取到一个完整条目就判断是否在删除列表里,不在的就调用writer写入新文件
可直接运行的示例代码
from ldif import LDIFParser, LDIFWriter # 自定义解析器类 class FilterLDIFParser(LDIFParser): def __init__(self, input_stream, output_stream, delete_dn_list): super().__init__(input_stream) self.writer = LDIFWriter(output_stream) # 需要删除的DN列表,转小写避免大小写匹配问题 self.delete_dn_list = [dn.lower() for dn in delete_dn_list] def handle(self, dn, entry): # 这里写过滤逻辑,当前是匹配DN在删除列表就跳过 if dn.lower() not in self.delete_dn_list: self.writer.unparse(dn, entry) if __name__ == "__main__": # 配置参数 INPUT_LDIF_PATH = "原文件路径.ldif" OUTPUT_LDIF_PATH = "过滤后输出路径.ldif" # 填入你要删除的DN列表 TO_DELETE_DN = [ "uid=rasannak,ou=people,dc=LNU,dc=edu", # 可以追加更多需要删除的DN ] with open(INPUT_LDIF_PATH, "rb") as in_f, open(OUTPUT_LDIF_PATH, "wb") as out_f: parser = FilterLDIFParser(in_f, out_f, TO_DELETE_DN) parser.parse()
扩展规则说明
如果不需要按完整DN匹配,修改handle方法里的判断逻辑即可:
- 要删除所有ou=people下的条目:添加判断
if "ou=people,dc=LNU,dc=edu" in dn:就跳过写入 - 要删除所有status为Faculty/Staff的条目:添加判断
if b"Faculty/Staff" in entry.get("status", []):就跳过写入 - 要删除mail后缀为@lnu.edu的条目:添加判断
if any(mail.endswith(b"@lnu.edu") for mail in entry.get("mail", [])):就跳过写入
注意LDIFParser读取到的属性值都是bytes类型,匹配的时候要注意编码,避免类型错误。
内容的提问来源于stack exchange,提问作者Prasanna K
相关产品推荐
相关产品推荐

