Cool_Breeze 发表于 2020-5-11 09:04:06

我写的第一个对象^_^! 打印表格 ( 更新了!Rev.02)

本帖最后由 Cool_Breeze 于 2020-8-22 14:57 编辑

'''
@ 从一个大列表里面格式化打印子列表
@ 2020/08/22
@ BY Cool_Breeze
'''

#coding=utf-8

class printf:
    def __init__(self, data, corner='+', head_tail='-', both_sides='|'):
      '''
      @ row_len 每一列数据最大长度的列表
      '''
      self.data = data
      self.corner = corner
      self.head_tail = head_tail
      self.both_sides = both_sides
      self.row_len = []
      self.__count_row_len()

    def __count_row_len(self):
      '''
      @ 计算每一列的长度
      @ 将每一个元素转换为字符串
      @ 按照第一个列表的长度来遍历所有列表,注意越界问题
      '''
      elements = len(self.data)
      for line_number in range(len(self.data)):
            if line_number == 0:
                for index in range(elements):
                  if not isinstance(self.data, str):
                        self.data = str(self.data)
                self.row_len = ]
            else:
                for index in range(elements):
                  if not isinstance(self.data, str):
                        self.data = str(self.data)
                  if self.row_len < len(self.data):
                     self.row_len = len(self.data)

    def split_line(self):
      '''
      @ 格式行
      @ 默认在每个元素两边各加上一个空格
      '''
      self.split_line_str = ''
      for i in self.row_len:
            self.split_line_str += (self.corner + self.head_tail * (i + 2))
      self.split_line_str += self.corner + '\n'
      print(self.split_line_str, end='')
      return self.split_line_str

    def data_line(self, title=True):
      '''
      @ 将字符串按格式整合
      @ 是否存在标题行
      @ title = True 将在第一行下面增加一行 split_line_str
      '''
      filling = ' '
      L_sides = self.both_sides + filling
      all_str = ''
      for elements in self.data:
            for nu,single in enumerate(elements):
                temp_single_len = len(single)
                if temp_single_len < self.row_len:
                  all_str += L_sides + single + filling * (self.row_len - temp_single_len + 1)
                else:
                  all_str += L_sides + single + filling
            all_str += self.both_sides + '\n'
            if title:
                all_str += self.split_line_str
                title = False
      print(all_str, end='')
      return all_str


if __name__ == '__main__':
    import csv
    test = []
    with open('test.csv') as f:
      f = csv.reader(f)
      for line in f:
            test.append(line)

    p = printf(test)
    # 写入日志
    with open('test.txt', 'w') as f:
      f.writelines(p.split_line())
      f.writelines(p.data_line())
      f.writelines(p.split_line())
result:
+-----------+--------------+--------------+--------------+--------------+--------------+--------------+
| TimeStamp | TMON_0_RDIL0 | TMON_0_RDIL1 | TMON_0_RDIL2 | TMON_0_RDIL3 | TMON_0_RDIL4 | TMON_0_RDIL5 |
+-----------+--------------+--------------+--------------+--------------+--------------+--------------+
| 19:18.6   | 61         | 59.5         | 58.5         | 60.5         | 60.75      | 61.25      |
| 19:19.6   | 60.75      | 58.5         | 57.25      | 59.75      | 60         | 60.25      |
| 19:20.6   | 60.25      | 57.5         | 57         | 59.25      | 59.5         | 60.5         |
| 19:21.7   | 59.75      | 58         | 57.5         | 59.5         | 59.5         | 60.25      |
| 19:22.7   | 59.75      | 58         | 57.5         | 59.5         | 58.75      | 60         |
| 19:23.7   | 60         | 58         | 57.5         | 59.5         | 59.25      | 60.25      |
| 19:24.8   | 59.25      | 57.5         | 57.25      | 59         | 59         | 59.75      |
| 19:25.8   | 59         | 57.25      | 56.5         | 58.75      | 58.5         | 59.25      |
| 19:26.8   | 59.25      | 57.25      | 56.5         | 59         | 58.75      | 59.5         |
| 19:27.8   | 58.5         | 56         | 55.5         | 57.75      | 57.75      | 58.5         |
| 19:28.9   | 58.25      | 56         | 55.5         | 57.5         | 57.5         | 58.25      |
| 19:29.9   | 58.5         | 56.5         | 56         | 58         | 57.75      | 58.5         |
| 19:30.9   | 59.25      | 57.25      | 57         | 58.5         | 58.5         | 59.5         |
| 19:31.9   | 59         | 57.25      | 57         | 59.5         | 59.25      | 59.75      |
+-----------+--------------+--------------+--------------+--------------+--------------+--------------+

请按任意键继续. . .

Cool_Breeze 发表于 2020-5-11 09:14:31

本帖最后由 Cool_Breeze 于 2020-5-13 11:39 编辑

Rev.01
支持任意列数!
还不支持中文,中文字节不好弄!
@hrp
@_2_ @ wp231957


使用以下方法,可以更简单
print('{:.10s}'.format(str(123.1321)))

Twilight6 发表于 2020-5-11 09:28:13

Cool_Breeze 发表于 2020-5-11 09:14
BUG还有,想想怎么修复,
还想支持多列打印,不知道怎么做!
现在就支持2列数据

建议加点注释吧 ~

Cool_Breeze 发表于 2020-5-11 09:36:36

Twilight6 发表于 2020-5-11 09:28
建议加点注释吧 ~

好的!的确是乱的很。我是学了C过来学Python的,对Python还不是很熟悉,望大家多多指教!

_2_ 发表于 2020-5-11 11:14:57

我还以为是另一半……

Cool_Breeze 发表于 2020-5-11 11:26:44

_2_ 发表于 2020-5-11 11:14
我还以为是另一半……

还没有思路!{:5_99:}

wp231957 发表于 2020-5-11 11:29:09

本帖最后由 wp231957 于 2020-5-11 11:30 编辑

Cool_Breeze 发表于 2020-5-11 09:14
BUG还有,想想怎么修复,
还想支持多列打印,不知道怎么做!
现在就支持2列数据

想实现多行多列   你需要存储数据的东东

比如   文件,数组啥的这里建议你使用LIST+DICT模式存储数据

_2_ 发表于 2020-5-11 11:37:09

Cool_Breeze 发表于 2020-5-11 11:26
还没有思路!

girlFriend 或者 boyFriend……

Cool_Breeze 发表于 2020-5-11 11:55:25

_2_ 发表于 2020-5-11 11:37
girlFriend 或者 boyFriend……

l need boyFriend{:5_92:}

Cool_Breeze 发表于 2020-5-11 11:56:33

wp231957 发表于 2020-5-11 11:29
想实现多行多列   你需要存储数据的东东

比如   文件,数组啥的这里建议你使用LIST+DICT模式存 ...

谢谢!你说的,我还没有接触到。我还在入门阶段{:10_266:}

hrp 发表于 2020-5-11 13:43:23

楼主想把它做成轮子不

Cool_Breeze 发表于 2020-5-11 13:51:47

hrp 发表于 2020-5-11 13:43
楼主想把它做成轮子不

有这个打算,但是现在这个技术还不支持我能够搞这些,我还得学习!

hrp 发表于 2020-5-11 14:43:17

Cool_Breeze 发表于 2020-5-11 13:51
有这个打算,但是现在这个技术还不支持我能够搞这些,我还得学习!

最近我在写个小程序,本来也想顺便写个这样的小轮子,越构思越觉得复杂,超出能力范围了,想找个现成的用{:10_254:}

_2_ 发表于 2020-5-11 14:58:03

Cool_Breeze 发表于 2020-5-11 11:55
l need boyFriend

我还没满 18 你不要这样

Cool_Breeze 发表于 2020-5-11 15:03:58

本帖最后由 Cool_Breeze 于 2020-5-11 16:14 编辑

hrp 发表于 2020-5-11 14:43
最近我在写个小程序,本来也想顺便写个这样的小轮子,越构思越觉得复杂,超出能力范围了,想找个现成的用 ...

我看看能不能搞成!
搞完这个可能我对面向对象编程有了进一步的了解!

_2_ 发表于 2020-5-11 16:35:41

Cool_Breeze 发表于 2020-5-11 11:56
谢谢!你说的,我还没有接触到。我还在入门阶段

你可以试试用 pprint(这是个模块,你可能还没学,内置)或者参考 Prettytable(这也是个模块,第三方)的源码学习学习{:10_256:}{:10_254:}

hrp 发表于 2020-5-11 16:53:18

Cool_Breeze 发表于 2020-5-11 15:03
我看看能不能搞成!
搞完这个可能我对面向对象编程有了进一步的了解!

加油{:10_279:}

Cool_Breeze 发表于 2020-5-11 17:41:11

_2_ 发表于 2020-5-11 16:35
你可以试试用 pprint(这是个模块,你可能还没学,内置)或者参考 Prettytable(这也是个模块,第三方)的源 ...

好的!

Cool_Breeze 发表于 2020-5-13 10:15:41

hrp 发表于 2020-5-11 16:53
加油

更新了哦!

hrp 发表于 2020-5-13 10:44:25

Cool_Breeze 发表于 2020-5-13 10:15
更新了哦!

楼主这个模块有github或者gitee么,我去给你点星星{:10_250:}周末研究下怎么用{:10_250:}
页: [1] 2
查看完整版本: 我写的第一个对象^_^! 打印表格 ( 更新了!Rev.02)