如何在使用循环时在python3字典中使用制表

问题描述 投票:0回答:2

我正在尝试将字典数据打印成表格形式,现在我看到tabulate模块作为一种简单的测试方法,但不知何故,我得到的数据是好的方式,但header信息在每次运行时重复用户名,请指导或建议如何做到这一点.....

$ cat checktable.py
#!/usr/bin/python3
import subprocess
import pandas as pd
from tabulate import tabulate

def CheckUid(user):
    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:
      raw_data = {'UserID': [split_str[1].split(',')[0].split('=')[1]], 'MangerID': [split_str[-1]]}
      headers = ["UserID", "MangerID"]
      return tabulate(raw_data, headers, tablefmt="simple")
    else:
      split_str = 'null'

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


if __name__ == '__main__':
    CallUid()

这将返回以下数据:

$ ./checktable.py
UserID    MangerID
--------  ----------
aashishp  rpudota
UserID    MangerID
--------  ----------
abaillie  davem
UserID    MangerID
--------  ----------
abishek   kalyang
UserID    MangerID

预期产量:

$ ./checktable.py
UserID    MangerID
--------  ----------
aashishp  rpudota
abaillie  davem
abishek   kalyang

另一个替代代码:

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

def CheckUid(user):
    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:
      raw_data = {'UserID': split_str[1].split(',')[0].split('=')[1], 'Manger': split_str[-1]}
      for key, value in raw_data.items():
        print(key, ":", value)
    else:
      split_str = 'null'

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

if __name__ == '__main__':
  CallUid()

它如下所示,我需要每两行两个成一个..

$ ./checktable2.py
UserID : aashishp
Manger : rpudota
UserID : abaillie
Manger : davem

虽然希望是:

$ ./checktable2.py
UserID : aashishp Manger : rpudota
UserID : abaillie Manger : davem
python-3.x dictionary tabular
2个回答
0
投票

在作为学习者苦苦挣扎之后,我带着以下代码变体来解决我自己的问题:

1)第一个代码使用pandas模块:

$ cat check_ldapUserdata.py
#!/usr/bin/python3
import pandas as pd
import subprocess

user_list = []
mngr_list = []

def CheckUid(user):
    proc = subprocess.Popen("ldapsearch -h ldapserver -D 'cn=directory manager' -w JatetRE3 -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 = split_str[1].split(',')[0].split('=')[1]
      manager = split_str[-1]
      user_list.append(user)
      mngr_list.append(manager)
    else:
      split_str = 'null'

def DataList():
      df = pd.DataFrame({'User':user_list, 'Manager':mngr_list})
      df = df[['User', 'Manager']]  # To keep the order of columns
      #return df
      print(df)

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

if __name__ == '__main__':
  CallUid()
  DataList()

结果输出如下......

$ ./check_ldapUserdata.py
       User   Manager
0      karn  benjamin
1     niraj   vikashg
2  vaithees  benjamin
3      mauj  benjamin

2)我使用正则表达式和qazxsw poi模块获得表格格式的另一种方式。

BeautifulTable

结果输出如下....

$ cat check_ldapUserdata2.py
#!/usr/bin/python3
import re
import subprocess
from beautifultable import BeautifulTable
table = BeautifulTable()
table.column_headers = ["User", "Manager"]

def CheckUid(user):
    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')
    pat_match = re.match(".*uid=(.*?)\,.*\nmanagerlogin:\s+(.*)",info_str)
    if pat_match:
        table.append_row([pat_match.group(1), pat_match.group(2)])

def CallUid():
  input_file=input("Please enter the file name : ")
  with open(input_file, mode='rt', encoding='utf-8') as f:
    for line in f.readlines():
      CheckUid(line)
  print(table)

if __name__ == '__main__':
  CallUid()

3)另一个简单的非表格形式但工作..

$ ./check_ldapUserdata2.py
Please enter the file name : testu
+----------+----------+
|   User   | Manager  |
+----------+----------+
|   karn   | benjamin |
+----------+----------+
|  niraj   | vikashg  |
+----------+----------+
| vaithees | benjamin |
+----------+----------+
|   mauj   | benjamin |
+----------+----------+

以上结果输出如下......

$ cat check_table_working1.py
#!/usr/bin/python3
import subprocess

def CheckUid(user):
    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:
      raw_data = {split_str[1].split(',')[0].split('=')[1] :  split_str[-1]}
      #raw_data = {'UserID': split_str[1].split(',')[0].split('=')[1], 'Manger': split_str[-1]}
      for key, value in raw_data.items():
        #print(key, ":", value)
        print('{} : {}'.format(key, value))
    else:
      split_str = 'null'

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

if __name__ == '__main__':
  CallUid()
© www.soinside.com 2019 - 2024. All rights reserved.