关于#python#的问题,如何解决?

请问怎么修改才能使输出的格式比较美观(居中对齐显示)?图一是在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()  # 调用主函数


img

img

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/756606
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:Python系列之:读取excel获取想要的数据,添加新的字段,调整字段顺序,添加新的行
  • 除此之外, 这篇博客: 【自动邮件】如何利用python自动发邮件(附件excel发送)中的 背景: 自动发送邮件可以将常规化得需求自动化,解放双手做更多有意义的事情 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 以下即为代码:

    # -*- 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处理Excel数据(实战案例)课程中的 虽然可以隐藏行列和工作表,但尽量不要这样做小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题分析:

    本题需要实现居中对齐显示,可以使用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(数据宽度)) + 数据

实现对齐