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

Python3循环使用tabulate处理字典,如何避免表头重复?

解决tabulate表头重复问题(代码1优化)

你遇到的表头重复问题,核心原因是每次循环都生成了一个带表头的独立表格。正确的思路应该是先收集所有用户的数据源,最后一次性用tabulate生成完整表格,这样表头只会出现一次。

修改后的checktable.py代码如下:

#!/usr/bin/python3
import subprocess
from tabulate import tabulate

def CheckUid(user):
    user = user.strip()  # 去掉换行符,避免ldapsearch查询出错
    proc = subprocess.Popen("ldapsearch -h ldapserver -D 'cn=directory manager' -w pass123 -LLLb 'ou=people,o=rraka.com' 'uid=%s' managerlogin" % (user), shell=True, stdout=subprocess.PIPE)
    info_str = proc.stdout.read().decode('utf8')
    split_str = info_str.split()
    if len(split_str) > 1:
        user_id = split_str[1].split(',')[0].split('=')[1]
        manager_id = split_str[-1]
        return [user_id, manager_id]  # 返回单个用户的原始数据,而非格式化表格
    else:
        return [user, 'null']  # 处理查询不到的异常情况

def CallUid():
    all_user_data = []
    headers = ["UserID", "MangerID"]
    with open('hh', mode='rt', encoding='utf-8') as f:
        for line in f.readlines():
            user_data = CheckUid(line)
            if user_data:
                all_user_data.append(user_data)
    # 最后一次性生成完整表格
    print(tabulate(all_user_data, headers, tablefmt="simple"))

if __name__ == '__main__':
    CallUid()

关键修改说明:

  1. CheckUid不再返回格式化后的表格,而是返回单个用户的[UserID, MangerID]列表,方便后续统一收集
  2. CallUid中新增all_user_data列表,循环读取文件时收集所有用户的数据
  3. 所有数据收集完成后,再调用tabulate生成表格,确保表头只输出一次,完全匹配你的期望输出

备选代码格式优化(checktable2.py调整)

针对你想要的同一行输出UserID和Manger的需求,只需要修改打印逻辑,直接拼接两个字段即可:

修改后的checktable2.py代码:

#!/usr/bin/python3
import subprocess

def CheckUid(user):
    user = user.strip()  # 去掉换行符,避免查询错误
    proc = subprocess.Popen("ldapsearch -h its3 -D 'cn=directory manager' -w JatetRE3 -LLLb 'ou=people,o=cadence.com' 'uid=%s' managerlogin" % (user), shell=True, stdout=subprocess.PIPE)
    info_str = proc.stdout.read().decode('utf8')
    split_str = info_str.split()
    if len(split_str) > 1:
        user_id = split_str[1].split(',')[0].split('=')[1]
        manager = split_str[-1]
        # 直接在同一行打印两个字段
        print(f"UserID : {user_id} Manger : {manager}")
    else:
        print(f"UserID : {user} Manger : null")  # 处理查询不到的情况

def CallUid():
    with open('hh', mode='rt', encoding='utf-8') as f:
        for line in f.readlines():
            CheckUid(line)

if __name__ == '__main__':
    CallUid()

关键修改说明:

用f-string直接拼接两个字段的输出内容,替代原来循环打印单个键值对的逻辑,实现同一行展示两个字段的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:09:06