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()
关键修改说明:
CheckUid不再返回格式化后的表格,而是返回单个用户的[UserID, MangerID]列表,方便后续统一收集CallUid中新增all_user_data列表,循环读取文件时收集所有用户的数据- 所有数据收集完成后,再调用
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
相关产品推荐
相关产品推荐

