[367]python3之PrettyTable模块(美化库)

安装:pip install PrettyTable

# -*- coding:utf-8 -*-
from prettytable import PrettyTable

x = PrettyTable(field_names=["name", "age", "sex", "money"])
x.align["name"] = "l"  # 以name字段左对齐
x.padding_width = 1   # 填充宽度
x.add_row(["wang",20, "man", 1000])
x.add_row(["alex",21, "man", 2000])
x.add_row(["peiqi",22, "man", 3000])
# print(x)
#表排序
print(x.get_string(sortby="money", reversesort=True))
#自带样式打印,参数还可以选择“DEFAULT”、“PLAIN_COLUMNS”
# print(x.set_style(MSWORD_FRIENDLY))
'''
+-------+-----+-----+-------+
|  name | age | sex | money |
+-------+-----+-----+-------+
|  wang |  20 | man |  1000 |
|  alex |  21 | man |  2000 |
| peiqi |  22 | man |  3000 |
+-------+-----+-----+-------+
'''

from prettytable import PrettyTable

pt = PrettyTable()
pt.field_names = [i for i in range(1, 10)]
mulp = [["{b}x{a}={c}".format(a=a, b=b, c=a * b) if a >= b else "" for b in range(1, 10)] for a in range(1, 10)]
for mu in mulp: pt.add_row(mu)
print(pt)
'''
+-------+--------+--------+--------+--------+--------+--------+--------+--------+
|   1   |   2    |   3    |   4    |   5    |   6    |   7    |   8    |   9    |
+-------+--------+--------+--------+--------+--------+--------+--------+--------+
| 1x1=1 |        |        |        |        |        |        |        |        |
| 1x2=2 | 2x2=4  |        |        |        |        |        |        |        |
| 1x3=3 | 2x3=6  | 3x3=9  |        |        |        |        |        |        |
| 1x4=4 | 2x4=8  | 3x4=12 | 4x4=16 |        |        |        |        |        |
| 1x5=5 | 2x5=10 | 3x5=15 | 4x5=20 | 5x5=25 |        |        |        |        |
| 1x6=6 | 2x6=12 | 3x6=18 | 4x6=24 | 5x6=30 | 6x6=36 |        |        |        |
| 1x7=7 | 2x7=14 | 3x7=21 | 4x7=28 | 5x7=35 | 6x7=42 | 7x7=49 |        |        |
| 1x8=8 | 2x8=16 | 3x8=24 | 4x8=32 | 5x8=40 | 6x8=48 | 7x8=56 | 8x8=64 |        |
| 1x9=9 | 2x9=18 | 3x9=27 | 4x9=36 | 5x9=45 | 6x9=54 | 7x9=63 | 8x9=72 | 9x9=81 |
+-------+--------+--------+--------+--------+--------+--------+--------+--------+
'''

#一行打印九九乘法表
print ('\n'.join([' '.join(['%s*%s=%-2s' % (j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)]))
'''
1*1=1 
1*2=2  2*2=4 
1*3=3  2*3=6  3*3=9 
1*4=4  2*4=8  3*4=12 4*4=16
1*5=5  2*5=10 3*5=15 4*5=20 5*5=25
1*6=6  2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7  2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8  2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9  2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
'''

###创建表

直接创建

pt = PrettyTable()

从已有文件创建

  • CSV
from prettytable import from_csv 
fp = open("mytable.csv", "r") 
pt = from_csv(fp) 
fp.close()
  • HTML
from prettytable import from_html 
pts = from_html(html_string)
  • SQL
from prettytable import from_db_cursor 
db_cur.execute("SELECT * FROM mytable") 
pt = from_db_cursor(db_cur)

###添加元素

  • 按行添加
pt.add_row()
  • 按列添加
pt.add_column()

输出格式

ASCII码表

  • 直接输出
print(pt)
  • 无表格框输出
print(pt.get_string())
  • HTML表
print(pt.get_html_string())
  • 选择子表
print(pt.get_string(fields = ["City name", "Population"]))
  • 输出前4列
print(pt.get_string(start = 0, end = 3))
new_table = old_table[0:3]
print(new_table)
  • 表排序
print(x.get_string(sortby="Annual Rainfall", reversesort=True))

控制表样式

  • 自带样式
#参数还可以选择“DEFAULT”、“PLAIN_COLUMNS”
from prettytable import MSWORD_FRIENDLY
x.set_style(MSWORD_FRIENDLY) 
print(x)

手动控制样式

  • 可调整选项

摘自prettytable文档

  • border - 布尔类型参数(必须是True或False)。控制表格边框是否显示。
  • header - 布尔类型参数(必须是True或False)。控制表格第一行是否作为表头显示。
  • header-style - 控制表头信息的大小写。允许的参数值:“cap”(每个单词首字母大写),“title”(除了介词助词首字母大写),“lower”(全部小写)或者None(不改变原内容格式)。默认参数为None。
  • hrules - 设置表格内部水平边线。允许的参数值:FRAME,ALL,NONE。注意这些是在prettytable模块内部定义的变量,在使用之前导入或用类似prettytable.FRAME的方法调用。
  • vrules - 设置表格内部竖直边线。允许的参数值:FRAME,ALL,NONE。
  • align - 水平对齐方式(None,“l”(左对齐),“c”(居中),“r”右对齐)
  • valign - 垂直对齐方式(None,“t”(顶部对齐),“m”(居中),“b”底部对齐)
  • int_format - 控制整型数据的格式。
  • float_format - 控制浮点型数据的格式。
  • padding_width - 列数据左右的空格数量。(当左右padding未设置时生效)
  • left_padding_width - 列数据左侧的空格数量。
  • right_padding_width - 列数据右侧的空格数量。
  • vertical_char - 绘制竖直边线的字符,默认为“|”
  • horizontal_char - 绘制水平边线的字符,默认为“-”
  • junction_char - 绘制水平竖直交汇点的字符,默认为“+”

两种设置方式等效

x = PrettyTable() 
x.border = False 
x.header = False 
x.padding_width = 5

or 

x = PrettyTable(border=False, header=False, padding_width=5)
  • 调整对齐方式的几种方法
print(x.get_string(align="l"))

x.align["City name"] = "l" 
x.align["Population"] = "c" 
x.align["Area"] = "r"

x.align = "l'
# -*- coding:utf-8 -*-
import requests
import re
import argparse
from bs4 import BeautifulSoup
from prettytable import PrettyTable

parser = argparse.ArgumentParser()
parser.add_argument('-c', '--city', default='hangzhou')
args = parser.parse_args()
city = args.city

url = 'http://weather.sina.com.cn/' + city
response = requests.get(url)
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'html.parser')

city = soup.find(class_='slider_ct_name').string
date = []
weather = []
temperature = []

pt = PrettyTable(['date', 'daytime', 'night', 'tempeature'])
pt.align['date'] = '1'
# get date
for item in soup('p', class_='wt_fc_c0_i_date'):
    date.append(bytes.decode(item.string.encode('utf-8')))
# get weather
for item in soup("img", {"class": 'icons0_wt'}):
    weather.append(bytes.decode(item['alt'].encode('utf-8')))
# get temperature
for item in soup('p', class_='wt_fc_c0_i_temp'):
    temperature.append(bytes.decode(item.string.encode('utf-8')))

# make table
for counter in range(7):
    currow = []
    currow.append(date[counter])
    currow.append(weather[2 * counter])
    currow.append(weather[2 * counter + 1])
    currow.append(temperature[counter])
    pt.add_row(currow)
print(pt)
filename = city + '7日天气' + '.txt'
with open(filename, 'w') as fp:
    fp.write('\t\t\t' + city + '7日天气\n')
    fp.write(str(pt))

结果:

+-------+---------+-------+-------------+
|  date | daytime | night |  tempeature |
+-------+---------+-------+-------------+
| 08-06 |    晴   |   晴  | 37°C / 27°C |
| 08-07 |   多云  |   晴  | 36°C / 27°C |
| 08-08 |   多云  |   晴  | 35°C / 26°C |
| 08-09 |    晴   |   晴  | 36°C / 27°C |
| 08-10 |    晴   |  多云 | 37°C / 27°C |
| 08-11 |   多云  |  多云 | 36°C / 27°C |
| 08-12 |   多云  |  多云 | 36°C / 27°C |
+-------+---------+-------+-------------+

参考:https://blog.csdn.net/u013630675/article/details/78773356

你可能感兴趣的:(python前行者)