鱼C论坛

 找回密码
 立即注册
查看: 2239|回复: 26

[作品展示] 我写的第一个对象^_^! 打印表格 ( 更新了!Rev.02)

[复制链接]
发表于 2020-5-11 09:04:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Cool_Breeze 于 2020-8-22 14:57 编辑
  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. 请按任意键继续. . .
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-11 09:14:31 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-5-13 11:39 编辑

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


使用以下方法,可以更简单
print('{:.10s}'.format(str(123.1321)))
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

建议加点注释吧 ~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-11 09:36:36 | 显示全部楼层
Twilight6 发表于 2020-5-11 09:28
建议加点注释吧 ~

好的!的确是乱的很。我是学了C过来学Python的,对Python还不是很熟悉,望大家多多指教!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-11 11:14:57 From FishC Mobile | 显示全部楼层
我还以为是另一半……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-11 11:26:44 | 显示全部楼层
_2_ 发表于 2020-5-11 11:14
我还以为是另一半……

还没有思路!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-11 11:29:09 | 显示全部楼层
本帖最后由 wp231957 于 2020-5-11 11:30 编辑
Cool_Breeze 发表于 2020-5-11 09:14
BUG还有,想想怎么修复,
还想支持多列打印,不知道怎么做!
现在就支持2列数据


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

比如   文件,数组  啥的  这里建议你使用LIST+DICT模式存储数据
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-11 11:37:09 From FishC Mobile | 显示全部楼层
Cool_Breeze 发表于 2020-5-11 11:26
还没有思路!

girlFriend 或者 boyFriend……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-11 11:55:25 | 显示全部楼层
_2_ 发表于 2020-5-11 11:37
girlFriend 或者 boyFriend……

l need boyFriend
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-11 11:56:33 | 显示全部楼层
wp231957 发表于 2020-5-11 11:29
想实现多行多列   你需要存储数据的东东

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

谢谢!你说的,我还没有接触到。我还在入门阶段
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-11 13:43:23 From FishC Mobile | 显示全部楼层
楼主想把它做成轮子不
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-11 13:51:47 | 显示全部楼层
hrp 发表于 2020-5-11 13:43
楼主想把它做成轮子不

有这个打算,但是现在这个技术还不支持我能够搞这些,我还得学习!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-11 14:43:17 From FishC Mobile | 显示全部楼层
Cool_Breeze 发表于 2020-5-11 13:51
有这个打算,但是现在这个技术还不支持我能够搞这些,我还得学习!

最近我在写个小程序,本来也想顺便写个这样的小轮子,越构思越觉得复杂,超出能力范围了,想找个现成的用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-11 14:58:03 From FishC Mobile | 显示全部楼层
Cool_Breeze 发表于 2020-5-11 11:55
l need boyFriend

我还没满 18 你不要这样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-11 15:03:58 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-5-11 16:14 编辑
hrp 发表于 2020-5-11 14:43
最近我在写个小程序,本来也想顺便写个这样的小轮子,越构思越觉得复杂,超出能力范围了,想找个现成的用 ...


我看看能不能搞成!
搞完这个可能我对面向对象编程有了进一步的了解!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-11 16:35:41 From FishC Mobile | 显示全部楼层
Cool_Breeze 发表于 2020-5-11 11:56
谢谢!你说的,我还没有接触到。我还在入门阶段

你可以试试用 pprint(这是个模块,你可能还没学,内置)或者参考 Prettytable(这也是个模块,第三方)的源码学习学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-11 16:53:18 From FishC Mobile | 显示全部楼层
Cool_Breeze 发表于 2020-5-11 15:03
我看看能不能搞成!
搞完这个可能我对面向对象编程有了进一步的了解!

加油
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-13 10:15:41 | 显示全部楼层

更新了哦!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 10:44:25 From FishC Mobile | 显示全部楼层
Cool_Breeze 发表于 2020-5-13 10:15
更新了哦!

楼主这个模块有github或者gitee么,我去给你点星星周末研究下怎么用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-19 06:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表