| ''' |
| @ 从一个大列表里面格式化打印子列表 |
| @ 2020/08/22 |
| @ BY Cool_Breeze |
| ''' |
| |
| |
| |
| 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[0]) |
| for line_number in range(len(self.data)): |
| if line_number == 0: |
| for index in range(elements): |
| if not isinstance(self.data[line_number][index], str): |
| self.data[line_number][index] = str(self.data[line_number][index]) |
| self.row_len = [len(string) for string in self.data[line_number]] |
| else: |
| for index in range(elements): |
| if not isinstance(self.data[line_number][index], str): |
| self.data[line_number][index] = str(self.data[line_number][index]) |
| if self.row_len[index] < len(self.data[line_number][index]): |
| self.row_len[index] = len(self.data[line_number][index]) |
| |
| 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[nu]: |
| all_str += L_sides + single + filling * (self.row_len[nu] - 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())COPY |