请问怎么修改才能使输出的格式比较美观(居中对齐显示)?图一是在python中输出的格式,要求改成像附图二excel表格里一样的格式
import requests # 导入requests库,用于发送网络请求
import random # 导入random库,用于生成随机验证码
import time # 导入time库,用于计算程序运行时间
# 定义常量
FETCH_CONTENT_URL = r'https://www.shanghairanking.cn/api/pub/v1/bcur?bcur_type=11&year=2023' # 排名查询API的URL
TABLE_FORMAT = "{0:^8}\t{1:^40}\t{2:^8}\t{3:^12}" # 输出表格的格式
TABLE_HEADER = TABLE_FORMAT.format("排名", " 校名", "城市", "总分") # 输出表格的表头
HEADERS = {
'Accept': 'application/json, text/plain, */*',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Host': 'www.shanghairanking.cn',
'Refer': 'https://www.shanghairanking.cn/rankings/bcur/202311',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 Edg/91.0.864.37',
}
def get_response():
"""
发送网络请求并获取响应
"""
try:
response = requests.get(FETCH_CONTENT_URL, headers=HEADERS) # 发送GET请求
response.raise_for_status() # 如果响应状态码不是200,抛出异常
j_data = response.json() # 将响应的JSON字符串转换为Python对象
return j_data
except requests.exceptions.RequestException as e:
print(f"请求错误:{e}")
return None
def fetch_data_from_response(response):
"""
从响应中提取数据
"""
result = []
for x in response['data']['rankings']: # 遍历响应中的排名数据
result.append([
x['ranking'], # 排名
x['univNameCn'], # 校名
x['province'], # 城市
x['score'] # 总分
])
return result
def print_table(data, limit):
"""
输出表格
"""
print(TABLE_HEADER) # 输出表格的表头
for a, b, c, d in data[:limit]: # 遍历数据并输出
print(TABLE_FORMAT.format(a, b, c, d))
def main():
"""
主函数
"""
print("欢迎使用高校排名查询系统!")
while True:
print("\n请选择功能:(输入数字后按回车)")
print("1.查询高校排名")
print("2.退出程序")
choice = input(">>>") # 获取用户输入的选项
if choice == "1":
print(f"\n验证码:{random.randint(1000, 9999)}") # 生成随机验证码
start_time = time.time() # 记录程序开始运行的时间
print(f"\n正在查询,请稍等...")
j_data = get_response() # 发送网络请求并获取响应
if j_data:
data = fetch_data_from_response(j_data) # 从响应中提取数据
print("\n查询结果如下:")
print_table(data, 20) # 输出表格
end_time = time.time() # 记录程序结束运行的时间
run_time = end_time - start_time # 计算程序运行时间
print(f"\n程序运行时间为:{run_time:.2f}秒")
elif choice == "2":
print("\n感谢使用高校排名查询系统,再见!")
exit(0) # 退出程序
else:
print("\n输入错误,请重新输入数字")
if __name__ == "__main__":
main() # 调用主函数
以下即为代码:
# -*- coding: utf-8 -*-
"""
Created on Wed Jul 3 12:22:58 2019
@author: wuxian
"""
import smtplib
import email.mime.multipart
import email.mime.text
import email.mime.base
import os.path
import xlwt
import time
import schedule
import sys
import os
with open(r'.\Desktop\PID.txt','a') as file:
file.write(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())+'\t')
file.write(str(sys.argv[0]).split('\\')[-1]+'\t')
file.write('PID:'+str(os.getpid())+'\t')
file.write('PPID:'+str(os.getppid())+'\n')
#open-'a':写入打开,如果文件存在则添加到尾部
# =============================================================================
#连接数据库
# =============================================================================
import pymysql
def dbreadsql(v_sql):
conn = pymysql.connect(host=None, port=3306,
user='root', passwd='wx123456', db= 'testwuxian',
charset='utf8')
cur = conn.cursor()
cur.execute(v_sql)
rows = cur.fetchall()
cur.close()
conn.close()
return rows
sql0 = "select * from testwuxian.register_info"
#sql1 = "select * from testwuxian.register_detail"
sql2 = "select * from testwuxian.search_info"
sql3 = "select * from testwuxian.search_detail"
rows0 = dbreadsql(sql0)
#rows1 = dbreadsql(sql1)
rows2 = dbreadsql(sql2)
rows3 = dbreadsql(sql3)
# 生成excel文件名
def mailsend(rows0,rows2,rows3):
v_file_name = 'COCOK生产库数据.xls'
# 生成excel文件
book = xlwt.Workbook()#
sheet1 = book.add_sheet('注册人数', cell_overwrite_ok=True)
# sheet2 = book.add_sheet('注册明细', cell_overwrite_ok=True)
sheet3 = book.add_sheet('关键字搜索次数', cell_overwrite_ok=True)
sheet4 = book.add_sheet('关键字搜索明细', cell_overwrite_ok=True)
#表头标题
sheet1.write(0, 0, '注册日期')
sheet1.write(0, 1, '注册人数')
# sheet2.write(0, 0, '注册日期')
# sheet2.write(0, 1, '手机号')
# sheet2.write(0, 2, '设备型号')
# sheet2.write(0, 3, '神策标识码')
sheet3.write(0, 0, '搜索日期')
sheet3.write(0, 1, '搜索总次数')
sheet4.write(0, 0, '搜索日期')
sheet4.write(0, 1, '搜索关键字')
sheet4.write(0, 2, '搜索次数')
# 每一列写入excel文件,不然数据会全在一个单元格中
for i in range(len(rows0)):
for j in range(2):
# print (rows[i][j])-
# print ("--------")
sheet1.write(i + 1, j, rows0[i][j])
# for i in range(len(rows1)):
# for j in range(4):
# # print (rows[i][j])-
# # print ("--------")
# sheet2.write(i + 1, j, rows1[i][j])
for i in range(len(rows2)):
for j in range(2):
# print (rows[i][j])-
# print ("--------")
sheet3.write(i + 1, j, rows2[i][j])
for i in range(len(rows3)):
for j in range(3):
# print (rows[i][j])-
# print ("--------")
sheet4.write(i + 1, j, rows3[i][j])
book.save("C:/Users/wuxian/Desktop/" + v_file_name)
# 邮件信息
From = "发送者邮箱"
To = "收件人邮箱"
Cc = "抄送人邮箱"
file_name = v_file_name
server = smtplib.SMTP_SSL("smtp.aliyun.com",465)
server.login("邮箱", "密码") # 仅smtp服务器需要验证时
# 构造MIMEMultipart对象做为根容器
main_msg = email.mime.multipart.MIMEMultipart()
# 构造MIMEText对象做为邮件显示内容并附加到根容器
text_msg = email.mime.text.MIMEText("Hi All,\n \n 正文部分内容,请查收,谢谢。\n \n Best Wishes!")
main_msg.attach(text_msg)
# 构造MIMEBase对象做为文件附件内容并附加到根容器
maintype,subtype = 'ershoufanglianjia','.xls'
# 读入文件内容并格式化
data = open("C:/Users/wuxian/Desktop/" + file_name, 'rb')
file_msg = email.mime.base.MIMEBase(maintype, subtype)
file_msg.set_payload(data.read())
data.close()
email.encoders.encode_base64(file_msg)
# 设置附件头
basename = os.path.basename("./Desktop/" + file_name)
file_msg.add_header('Content-Disposition',
# 附件如果有中文会出现乱码问题,加入gbk
'attachment', filename=('gbk', '', basename))
main_msg.attach(file_msg)
# 设置根容器属性
main_msg['From'] = From
main_msg['To'] = To
main_msg['Cc'] = Cc
main_msg['Subject'] = "邮件主题"
main_msg['Date'] = email.utils.formatdate()
# 得到格式化后的完整文本
fullText = main_msg.as_string()
# 用smtp发送邮件
try:
server.sendmail(From, To.split(',') + Cc.split(','), fullText)
print("发送成功")
except Exception as e:
print("发送失败")
print(str(e))
finally:
server.quit()
mailsend(rows0,rows2,rows3)
#若是需要定时发送则使用以下代码:
#schedule.every().day.at('8:00').do(mailsend)
#while True:
# schedule.run_pending()
# time.sleep(60)
问题分析:
本题需要实现居中对齐显示,可以使用Python内置的字符串格式化方法。具体而言,我们可以利用str.format()
方法和填充符号^
来实现,代码如下所示:
s = 'hello'
width = 10
print("{:^{w}}".format(s, w=width))
输出结果为:
hello
其中,{}
表示要替换的位置,而^{w}
表示位置w
上放置一个中心对齐的字符串(当然,w
是一个具体的整数,取决于需要占用几个字符宽度),对于不够宽的字符串,Python会自动用空格进行填充,因此我们无需自己进行额外的空格填充。
具体的使用方式,我们可以根据实际需要进行调整,例如下面这个例子:
# 显示表头
header = ['Name', 'Age', 'Gender']
width = 10 # 假设每个字段需要占用10个字符的宽度
for s in header:
print("{:^{w}}".format(s, w=width), end='')
print()
# 显示数据
data = [['Tom', 18, 'Male'], ['Cindy', 21, 'Female'], ['Mike', 16, 'Male']]
for d in data:
for s in d:
print("{:^{w}}".format(str(s), w=width), end='')
print()
输出结果为:
Name Age Gender
Tom 18 Male
Cindy 21 Female
Mike 16 Male
其中,第一行为列名,第二行及其之后为数据。我们对每一个字符串都进行了中心对齐,并占用了相同的宽度。
参考代码如下:
首先,换用一种等宽的字体
其次,可以用
" " * (栏宽 - len(数据宽度)) + 数据
实现对齐