You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现Zimbra zmprov转CSV/LDIF的规范方法求助

规范实现Zimbra zmprov格式到CSV和LDIF的转换

Hey there! Let's fix this conversion properly—your current line-by-line print approach works, but we can make it cleaner, reusable, and more maintainable by first parsing the zmprov data into structured user objects, then generating your desired outputs from that structure. This way you won't have to reprocess the file multiple times if you need both CSV and LDIF.

核心思路

  1. 解析数据:把zmprov文件的每一行转换成包含用户所有属性的字典,收集到一个列表中
  2. 按需输出:用这个结构化的用户列表,分别生成符合要求的CSV和LDIF文件(Python内置模块就能搞定格式规范)

完整实现代码

import shlex
import csv

def parse_zmprov(file_path):
    """解析zmprov文件,返回用户字典列表"""
    users = []
    current_user = None
    
    with open(file_path, 'r') as input_file:
        for line in input_file:
            line = line.strip()
            if not line:
                continue  # 跳过空行
            
            # 用shlex.split处理带引号的字段(比如'User One'会被识别为一个整体)
            parts = shlex.split(line)
            
            if parts[0] == 'ca':
                # 遇到新用户,先保存上一个用户(如果存在)
                if current_user is not None:
                    users.append(current_user)
                # 初始化新用户,mail是第二个字段
                current_user = {'mail': parts[1]}
            elif parts[0] == 'ma':
                # 添加属性到当前用户:parts[2]是属性名,parts[3]是属性值
                attr_name = parts[2]
                attr_value = parts[3]
                current_user[attr_name] = attr_value
    
    # 循环结束后添加最后一个用户
    if current_user is not None:
        users.append(current_user)
    
    return users

def generate_csv(users, output_path):
    """从用户列表生成CSV文件"""
    # 定义需要的字段顺序(可以根据需求调整)
    field_names = ['mail', 'cn', 'cpf', 'l']
    
    with open(output_path, 'w', newline='') as csv_file:
        writer = csv.DictWriter(csv_file, fieldnames=field_names)
        writer.writeheader()  # 写入表头
        
        for user in users:
            # 用get方法处理缺失/空值,确保每个字段都有内容(空字符串)
            row = {field: user.get(field, '') for field in field_names}
            writer.writerow(row)

def generate_ldif(users, output_path):
    """从用户列表生成LDIF文件"""
    with open(output_path, 'w') as ldif_file:
        for user in users:
            # 写入DN条目
            ldif_file.write(f"dn: uid={user['mail']}\n")
            
            # 遍历用户属性,只写入非空值(LDIF通常不保留空属性)
            for attr, value in user.items():
                if value:
                    ldif_file.write(f"{attr}: '{value}'\n")
            
            # 每个用户条目之间加空行分隔
            ldif_file.write('\n')

# 主程序调用
if __name__ == "__main__":
    # 替换为你的zmprov文件路径
    zmprov_file_path = "zmprov_input.txt"
    # 解析数据
    user_list = parse_zmprov(zmprov_file_path)
    # 生成CSV
    generate_csv(user_list, "users.csv")
    # 生成LDIF
    generate_ldif(user_list, "users.ldif")

代码细节解释

  • 解析阶段:用shlex.split()替代普通的split(),能正确处理带空格的引号值(比如'User One'不会被拆成两个元素)。每次遇到ca命令就创建新用户字典,ma命令则补充属性。
  • CSV生成:用Python内置的csv.DictWriter自动处理格式问题——带空格的值会自动加引号,空值会生成空单元格,完全符合你期望的输出。
  • LDIF生成:只写入非空属性(比如user1的空cpf、user2的空l都会被跳过),每个用户条目间加空行,符合LDIF的规范格式。

输出验证

  • CSV输出:和你期望的完全一致,表头和行格式自动处理
  • LDIF输出:自动跳过空属性,条目分隔清晰,符合示例要求

内容的提问来源于stack exchange,提问作者yodog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:50:48