Board logo

标题: [原创代码] python3 打印表格 [打印本页]

作者: Gin_Q    时间: 2020-8-5 14:01     标题: python3 打印表格

本帖最后由 Gin_Q 于 2020-8-22 14:55 编辑
  1. '''
  2. @ 从一个大列表里面格式化打印子列表
  3. @ 2020/08/22
  4. @ BY Cool_Breeze
  5. '''
  6. #coding=utf-8
  7. class printf:
  8.     def __init__(self, data, corner='+', head_tail='-', both_sides='|'):
  9.         '''
  10.         @ row_len 每一列数据最大长度的列表
  11.         '''
  12.         self.data = data
  13.         self.corner = corner
  14.         self.head_tail = head_tail
  15.         self.both_sides = both_sides
  16.         self.row_len = []
  17.         self.__count_row_len()
  18.     def __count_row_len(self):
  19.         '''
  20.         @ 计算每一列的长度
  21.         @ 将每一个元素转换为字符串
  22.         @ 按照第一个列表的长度来遍历所有列表,注意越界问题
  23.         '''
  24.         elements = len(self.data[0])
  25.         for line_number in range(len(self.data)):
  26.             if line_number == 0:
  27.                 for index in range(elements):
  28.                     if not isinstance(self.data[line_number][index], str):
  29.                         self.data[line_number][index] = str(self.data[line_number][index])
  30.                 self.row_len = [len(string) for string in self.data[line_number]]
  31.             else:
  32.                 for index in range(elements):
  33.                     if not isinstance(self.data[line_number][index], str):
  34.                         self.data[line_number][index] = str(self.data[line_number][index])
  35.                     if self.row_len[index] < len(self.data[line_number][index]):
  36.                        self.row_len[index] = len(self.data[line_number][index])
  37.     def split_line(self):
  38.         '''
  39.         @ 格式行
  40.         @ 默认在每个元素两边各加上一个空格
  41.         '''
  42.         self.split_line_str = ''
  43.         for i in self.row_len:
  44.             self.split_line_str += (self.corner + self.head_tail * (i + 2))
  45.         self.split_line_str += self.corner + '\n'
  46.         print(self.split_line_str, end='')
  47.         return self.split_line_str
  48.     def data_line(self, title=True):
  49.         '''
  50.         @ 将字符串按格式整合
  51.         @ 是否存在标题行
  52.         @ title = True 将在第一行下面增加一行 split_line_str
  53.         '''
  54.         filling = ' '
  55.         L_sides = self.both_sides + filling
  56.         all_str = ''
  57.         for elements in self.data:
  58.             for nu,single in enumerate(elements):
  59.                 temp_single_len = len(single)
  60.                 if temp_single_len < self.row_len[nu]:
  61.                     all_str += L_sides + single + filling * (self.row_len[nu] - temp_single_len + 1)
  62.                 else:
  63.                     all_str += L_sides + single + filling
  64.             all_str += self.both_sides + '\n'
  65.             if title:
  66.                 all_str += self.split_line_str
  67.                 title = False
  68.         print(all_str, end='')
  69.         return all_str
  70. if __name__ == '__main__':
  71.     import csv
  72.     test = []
  73.     with open('test.csv') as f:
  74.         f = csv.reader(f)
  75.         for line in f:
  76.             test.append(line)
  77.     p = printf(test)
  78.     # 写入日志
  79.     with open('test.txt', 'w') as f:
  80.         f.writelines(p.split_line())
  81.         f.writelines(p.data_line())
  82.         f.writelines(p.split_line())
复制代码
result:
  1. +-----------+--------------+--------------+--------------+--------------+--------------+--------------+
  2. | TimeStamp | TMON_0_RDIL0 | TMON_0_RDIL1 | TMON_0_RDIL2 | TMON_0_RDIL3 | TMON_0_RDIL4 | TMON_0_RDIL5 |
  3. +-----------+--------------+--------------+--------------+--------------+--------------+--------------+
  4. | 19:18.6   | 61           | 59.5         | 58.5         | 60.5         | 60.75        | 61.25        |
  5. | 19:19.6   | 60.75        | 58.5         | 57.25        | 59.75        | 60           | 60.25        |
  6. | 19:20.6   | 60.25        | 57.5         | 57           | 59.25        | 59.5         | 60.5         |
  7. | 19:21.7   | 59.75        | 58           | 57.5         | 59.5         | 59.5         | 60.25        |
  8. | 19:22.7   | 59.75        | 58           | 57.5         | 59.5         | 58.75        | 60           |
  9. | 19:23.7   | 60           | 58           | 57.5         | 59.5         | 59.25        | 60.25        |
  10. | 19:24.8   | 59.25        | 57.5         | 57.25        | 59           | 59           | 59.75        |
  11. | 19:25.8   | 59           | 57.25        | 56.5         | 58.75        | 58.5         | 59.25        |
  12. | 19:26.8   | 59.25        | 57.25        | 56.5         | 59           | 58.75        | 59.5         |
  13. | 19:27.8   | 58.5         | 56           | 55.5         | 57.75        | 57.75        | 58.5         |
  14. | 19:28.9   | 58.25        | 56           | 55.5         | 57.5         | 57.5         | 58.25        |
  15. | 19:29.9   | 58.5         | 56.5         | 56           | 58           | 57.75        | 58.5         |
  16. | 19:30.9   | 59.25        | 57.25        | 57           | 58.5         | 58.5         | 59.5         |
  17. | 19:31.9   | 59           | 57.25        | 57           | 59.5         | 59.25        | 59.75        |
  18. +-----------+--------------+--------------+--------------+--------------+--------------+--------------+
  19. 请按任意键继续. . .
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2