疫情数据查询与动态统计图的GUI实践:技术设计与数据加载挑战

import requests import xlwt import xlrd import re import sys import threading import os...

import requests
import xlwt
import xlrd
import re
import sys
import threading
import os
import PySimpleGUI as sg
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
import matplotlib
def url_text_get(url,code='utf-8'):#一个网页类容获取
    r=requests.get(url)
    kv={'User-angent':'Mozilla/5.0'}
    r.raise_for_status()
    r.encoding=code
    return r.text
def url_infor_get():#总人口链接信息提取
    start_url='https://www.phb123.com/city/renkou/rk_'
    r_url_lis=[]
    for i in range(1,13):
        r_url_lis.append(start_url+str(i)+'.html')
    return r_url_lis
def ayurl(html):#总疫情链接类容获取
    soup=BeautifulSoup(html,'html.parser')
    y_url_list_infor=list(list())
    lp=soup('ul')
    soup1=BeautifulSoup(str(lp[1]),'html.parser')
    l=soup1('a')
    i=0
    for link in soup1.find_all('a'):
        li=[]
        li.append(l[i].string)
        i=i+1
        li.append(link.get('href'))
        y_url_list_infor.append(li)
    return y_url_list_infor
def download(li,p_list):
    global apath
    root = "d:/python练习文档/全球历史数据"
    isExists = os.path.exists(root)
    if not isExists:
        os.makedirs(root)
    else:
        pass
    path = root +'/'+ li[0] + '.xls'
    apath=root
    url =li[1]
    r = requests.get(url)
    with open(path, 'wb') as t:
        t.write(r.content)
        t.close()
    try:
        d_xieru(p_list, path, li[0])
    except:
        pass
def down(li,p_list):
    day = lp(p_list)
    for i in li:
        t=threading.Thread(target=download,args=(i,p_list,))
        t.start()
    while threading.activeCount() !=1:
        pass
    return day
def yqlj():#历史疫情情况链接获取
    y_url_list_infor2=list(list())
    ul='http://www.sy72.com/xls/world'
    ul2='http://www.sy72.com/world/world417_25970.html'
    y_url_list_infor=ayurl(url_text_get(ul2))
    for i in range(0,len(y_url_list_infor)):
        ty=[]
        ty.append(y_url_list_infor[i][0])
        number=''.join(re.findall(r'[0-9]+',y_url_list_infor[i][1]))
        ty.append(ul+number+'.xls')
        y_url_list_infor2.append(ty)
    return y_url_list_infor2
def text_renkou_get(html,li):#一个人口数获取
    soup=BeautifulSoup(html,'html.parser')
    s=soup.find_all('tr')
    o=BeautifulSoup(str(s),'html.parser').find_all('td')
    for i in range(int(len(o)/5)):
        ls=[]
        ls.append(o[5*i+1].p.string)
        ls.append(o[5*i+2].string)
        li.append(ls)
def renkouhuode(ur_list):#总人口数获得
    global window
    layout = [[sg.Text('人口下载进度'),sg.Text('0.00%',key='2')],
              [sg.ProgressBar(len(ur_list), orientation='h', size=(20, 20), key='progressbar')],
              [sg.Cancel()]]
    window1= sg.Window('下载进度', layout)
    progress_bar = window1['progressbar']
    t_li=list(list())
    for i in range(len(ur_list)):
        url=ur_list[i]
        text_renkou_get(url_text_get(url),t_li)
        event, values = window1.read(timeout=20)
        if event == "Cancel":
            sys.exit(0)
        progress_bar.UpdateBar(i+ 1)
        window1.FindElement("2").Update(str("{:.2f}".format((i/len(ur_list)) * 100) + '%'))
    window1.close()
    # window.Element('2').Update(disabled=True)
    # window.Element('4').Update(disabled=True)
    window.Element('6').Update("***全球人口下载成功!***")
    event, values = window.read(timeout=100)
    f = xlwt.Workbook()
    sheet1 = f.add_sheet('class')
    for i in range(len(t_li)):
        sheet1.write(i + 1, 0, t_li[i][0])
        sheet1.write(i + 1, 1, t_li[i][1])
    f.save('全球国家人口数.xls')
    window.Element('6').Update(values.get('6')+"***全球人口保存路径为:"+os.path.split(os.path.realpath(__file__))[0]+"***")
    return t_li
def tjs(x,y):#天数计算
    day=0
    if(x==1):
        day=y
    elif(x==2):
        day=31+y
    elif(x==3):
        day=60+y
    elif(x==4):
        day=91+y
    elif(x==5):
        day=121+y
    elif(x==6):
        day=152+y
    elif(x==7):
        day=182+y
    elif (x == 8):
        day = 213 + y
    elif (x == 9):
        day = 244+ y
    elif (x == 10):
        day = 274 + y
    elif (x == 11):
        day = 305+ y
    elif (x == 12):
        day = 335 + y
    return day
def wenjianhuoqu():#文件夹所有子文件目录获取
    filepath = 'd:/python练习文档/全球历史数据/'
    r_lis = list()
    pathDir=os.listdir(filepath)
    for allDir in pathDir:
        try:
            r_lis.append(os.path.join('%s%s'%(filepath,allDir)))
        except:
            print('{0:}位元素出错'.format(i))
    return r_lis
def lp(p_list):
    url="http://www.sy72.com/covid/index.asp?s1=0&s2=0"
    soup=BeautifulSoup(url_text_get(url),"html.parser")
    l=soup.find('tr',id="cx")
    data=list()
    adata=list()
    path="D:/python练习文档/全球历史数据/中国.xls"
    for i in l.children:
        soupl=BeautifulSoup(str(i),"html.parser")
        p=soupl.find_all("span")
        if(p!=[]):
            g=[]
            for k in p:
                g.append(k.string)
            data.append(g)
    y=['国家','疫情总确诊','疫情治愈','疫情死亡','时间']
    adata.append(y)
    for j in range(len(data[0])):
        t=list()
        t.append("中国")
        t.append(data[2][j])
        t.append(data[3][j])
        t.append(data[4][j])
        t.append(str(tjs(int(data[0][j].split(".")[-2]),int(data[0][j].split(".")[-1]))))
        adata.append(t)
    for j in range(len(p_list)):
        if(p_list[j][0]=="中国"):
            adata[0].append('人口')
            adata[0].append('占比')
            for o in range(1,len(adata)):
                adata[o].append(p_list[j][1])
                adata[o].append(int(adata[o][1])/cf(p_list[j][1].split(',')))
    renkoubaocun(adata, path)
    return len(adata)-1
def riqizhuanhuan(data,p_list,s):#日期转换为天数
    for i in range(1,len(data)):
        try:
            k=tjs(int(data[i][4].split('/')[-2]),int(data[i][4].split('/')[-1]))
            data[i][4]=str(k)
        except:
            print("第{0:}行出错".format(i))
    for j in range(len(p_list)):
        if(p_list[j][0]==s):
            data[0].append('人口')
            data[0].append('占比')
            for o in range(1,len(data)):
                data[o].append(p_list[j][1])
                data[o].append(int(data[o][1])/cf(p_list[j][1].split(',')))
    return data
def cf(li):#'千分号字符转换int'
    s=''
    for i in range(len(li)):
        s=s+li[i]
    return int(s)
def renkoubaocun(l_li,filename2):#疫情信息人口保存.xls
    f=xlwt.Workbook()
    sheet1 = f.add_sheet('class')
    for i in range(0,len(l_li)):
        try:
            sheet1.write(i,0,l_li[i][0])
            sheet1.write(i,1,l_li[i][1])
            sheet1.write(i,2,l_li[i][2])
            sheet1.write(i,3,l_li[i][3])
            sheet1.write(i,4,l_li[i][4])
            sheet1.write(i,5,l_li[i][5])
            sheet1.write(i,6,l_li[i][6])
        except:
            break
    f.save(filename2)
def d_xieru(p_list,path,s):#多个文件天数转换加xls转换
    l_list=riqizhuanhuan(read_txt(path),p_list,s)
    renkoubaocun(l_list,path)
def read_txt(filename):
    data=list()
    file=open(filename,'r',encoding='ANSI')
    file_data=file.readlines()
    for row in file_data:
        row = re.sub(r'<.*?>', "	",row)
        tmp_list=row.split('	')
        tmp_list[-1]=tmp_list[-1].replace('
','')
        tmp_list.pop(-1)
        data.append(tmp_list)
    file.close()
    return data
def pxu(e_list):#排序
    for lis in e_list:
        for i in range(len(lis)-1):
            for k in range(i+1,len(lis)):
                if(lis[k][1]>lis[i][1]):
                    p=lis[i]
                    lis[i]=lis[k]
                    lis[k]=p
def xieru(r_lis,e_list,z_list,day):#每天的数据读入
    global window
    n=26
    layout = [[sg.Text('数据加载进度'),sg.Text('0.00%',key='2')],
              [sg.ProgressBar(day, orientation='h', size=(20, 20), key='progressbar')],
              [sg.Cancel()]]
    window1= sg.Window('加载进度', layout)
    progress_bar = window1['progressbar']
    for i in range(n,day+n-1):
        e_list.append([])
        z_list.append([])
        for j in range(len(r_lis)):
            try:
                data=xlrd.open_workbook(r_lis[j])
                table=data.sheet_by_name(data.sheet_names()[0])
                rowNum=table.nrows
                kli=[]
                cli=[]
                key=0
                for l in range(1,rowNum):
                    if(int(table.cell(l,4).value)==i and table.cell(l,0).value==table.cell(2,0).value):
                        kli.append(table.cell(l,0).value)
                        kli.append(table.cell(l,6).value)
                        try:
                            cli.append(table.cell(l,0).value)
                            cli.append(int(table.cell(l,3).value)/int(table.cell(l,1).value))
                        except:
                            cli.append(0)
                        key=1
                        break
                if(key==1):
                    e_list[i-n].append(kli)
                    z_list[i-n].append(cli)
            except:
                continue
        event, values = window1.read(timeout=20)
        if event=="Cancel":
            window1.close()
            sys.exit(0)
        progress_bar.UpdateBar(i-n+1)
        window1.FindElement("2").Update(str("{:.2f}".format(((i-n)/(day))*100)+'%'))
    window1.close()
    #window.Element('2').Update(disabled=True)
    #window.Element('4').Update(disabled=True)
    try:
        e_list.remove([])
        z_list.remove([])
    except:
        return
def plante(e_list,t):#循环画图
    plt.switch_backend('TkAgg')
    plt.ion()
    matplotlib.rc('font', family='SimHei', weight='bold')
    try:
        for j in range(len(e_list)):
            if((j+26)==153 or (j+26)==133 ):
                continue
            else:
                if(len(e_list[j])>=20):
                    N=20
                else :
                    N=len(e_list[j])
                name=[]
                for i in range(N):
                    name.append(e_list[j][i][0])
                for i in range(N,20):
                    name.append('暂无数据')
                city_name = name
                city_name.reverse()
                data = []
                we=10
                while(e_list[j][0][1]*we<50):
                    we=we*10
                if(e_list[j][0][1]*we>200):
                    we=we/5
                for i in range(N,20):
                    data.append(0)
                for i in range(N):
                    data.append(((e_list[j][N-i-1][1])*we))
                colors = ['red', 'yellow', 'blue', 'green', 'gray','pink','black']
                colors.reverse()
                plt.barh(range(len(data)),width=data, tick_label=city_name, color=colors)
                for a,b in zip(data,range(len(data))):
                    plt.text(a+3, b,'{0:.2f}'.format(a), ha='center', va= 'center',fontsize=7)
                if(t==1):
                    plt.title('2020年第{0:}天全球国家感染率'.format(j+26))
                    plt.xlabel('累计人数/总人口(1/{0:})'.format(we))
                if(t==2):
                    plt.title('2020年第{0:}天全球国家治愈率'.format(j+26))
                    plt.xlabel('治愈人数/总确诊(1/{0:})'.format(we))
                plt.pause(0.275)
                plt.show()
                if(j==len(e_list)-1):
                    break
                plt.clf()
    except:
        pass
def guojiachaxun(r_list,s):
    li=list()
    for i in r_list:
        if(i.split("/")[-1].split(".")[0]==s):
            data = xlrd.open_workbook(i)
            table = data.sheet_by_name(data.sheet_names()[0])
            rowNum = table.nrows
            for l in range(0, rowNum):
                kli = []
                key = 0
                kli.append(table.cell(l, 0).value)
                kli.append(table.cell(l, 1).value)
                kli.append(table.cell(l, 4).value)
                kli.append(table.cell(l, 5).value)
                kli.append(table.cell(l, 6).value)
                try:
                    kli.remove([])
                except:
                    pass
                li.append(kli)
    return li
def riqichaxun(e_list,z_list,s):
    i=list()
    try:
        day=tjs(int(s.split(".")[0]),int(s.split(".")[1]))
        i=e_list[day-26]
        for j in range(len(z_list[day-26])):
            i[j].append(z_list[day-26][j][1])
    except:
        pass
    return i
if __name__=="__main__":#程序入口
    global window,apath
    apath=''
    sg.theme('Dark Brown 1')
    gn = [
        [sg.InputText(default_text="请输入国家名", key='0', font=("Helvetica", 10)),
         sg.Button('G查询', size=(10, 1),key=('5'), font=("Helvetica", 10),disabled=True),
         sg.Text('叙述', size=(3, 1), font=("Helvetica", 10)),
         sg.Button('确诊统计图', size=(10, 1),key=('2'), font=("Helvetica", 10),disabled=True)],
        [sg.InputText(default_text="请输入日期(x.y)", key='1', font=("Helvetica", 10)),
         sg.Button('T查询', size=(10, 1),key=('3'),font=("Helvetica", 10),disabled=True),
         sg.Text('叙述', size=(3, 1), font=("Helvetica", 10)),
         sg.Button('治愈统计图', size=(10, 1),key=('4'),font=("Helvetica", 10),disabled=True)],
    ]
    headings = ['', '', '', '', '']
    header = [[sg.Text('  ')] + [sg.Text(h, size=(12, 1)) for h in headings]]
    input_rows = [[sg.Multiline('', key='6', size=(75, 45), autoscroll=True)]]
    layout = gn + header + input_rows
    window = sg.Window('全球新冠历史数据', layout, icon='icon/puple128.ico', font='Courier 12', size=(750, 500))
    event, values = window.read(timeout=100)
    try:
        day=down(yqlj(),renkouhuode(url_infor_get()))#文件下载加转换集合
    except:
        window.Element('6').Update( "***全球疫情信息下载失败,将使用历史文件信息!***")
    event, values = window.read(timeout=100)
    window.Element('6').Update(values.get('6')+"***全球疫情信息下载转换成功!***")
    window.Element('6').Update(values.get('6') + "***历史疫情保存地址为:{:}***".format(apath))
    window.Element('2').Update(disabled=False)
    window.Element('4').Update(disabled=False)
    window.Element('3').Update(disabled=False)
    window.Element('5').Update(disabled=False)
    event, values = window.read(timeout=100)
    e_list = list(list(list()))
    z_list = list(list(list()))
    try:
        xieru(wenjianhuoqu(), e_list, z_list, day)
    except:
        window.Element('2').Update(disabled=True)
        window.Element('4').Update(disabled=True)
        window.Element('3').Update(disabled=True)
        window.Element('6').Update(values.get('6') + "***数据载入失败!***")
    event, values = window.read(timeout=100)
    window.Element('6').Update(values.get('6') + "***数据加载成功!***"+"
"+"***请开始进行操作***"+"
",autoscroll=False)
    pxu(e_list)
    pxu(z_list)
    while True:
        event, values = window.read()
        if event in (None,'关闭'):
            break
        if event in(None,'5'):
            try:
                t = "{0:<8}{1:<12}{2:<5}{3:<15}{4:<20}"
                window.Element('6').Update(t.format("国家","疫情总确诊","时间","人口","确诊占比"))
                s = values.get('0')
                data = guojiachaxun(wenjianhuoqu(), s)
                if(s=="中国"):
                    data=data[:1:-1]
                for l in range(1,len(data)):
                    ty=[]
                    event, values = window.read(timeout=100)
                    for i in range(len(data[l])):
                        ty.append(str(data[l][i]))
                    window.Element('6').Update(values.get('6') +t.format(ty[0],ty[1],ty[2],ty[3],ty[4]))
            except:
                window.Element('6').Update(values.get('6') + "***错误!***")
        if event in(None,'3'):
            '''try:'''
            t="{0:<4}{1:<8}{2:<20}{3:<20}{4:<6}"
            window.Element('6').Update(t.format("排名","国家","确诊占比","治愈占比","日期"))
            s = values.get('1')
            data = riqichaxun(e_list,z_list,s)
            for l in range(len(data)):
                ty=list()
                event, values = window.read(timeout=100)
                for i in range(len(data[l])):
                    ty.append(str(data[l][i]))
                window.Element('6').Update(values.get('6')+t.format(str(l),ty[0],ty[1],ty[2],s))
            '''except:
                window.Element('6').Update(values.get('6') + "***错误!***")'''
        if event in (None,'2'):
            t=1
            plante(e_list, t)
        if event in (None,'4'):
            t=2
            plante(z_list, t)
    window.close()

本文来自作者[曼山]投稿,不代表利天创世立场,如若转载,请注明出处:https://wap.yqlvyou.com/zskp/202509-5718.html

(9)

文章推荐

  • 赖斯告别西汉姆联

        伦敦,7月15日——英超球队西汉姆联今日宣布,英格兰中场德克兰·赖斯以创纪录的转会费离开球队。  这位24岁的球员在与阿森纳的传闻中离开了俱乐部,最近他带领西汉姆联赢得了欧洲联赛冠军,并在英超联赛中排名第14。  西汉姆联的联合主席大卫·沙利

    2025年08月05日
    10
  • 新经营者成功挽救八条北伦敦巴士路线,提升公共交通服务

      在一家公交公司突然取消了8项伦敦交通局的服务后,找到了新的运营商。沙利文巴士公司负责运营217、298、299、327、389、399、549和W9公交线路,该公司在周五表示,由于伦敦交通局的“收入减少”,他们“不情愿”地决定停止服务。然

    2025年08月25日
    11
  • 冬季来临:疫苗助力我们的工作与生活

    早上7点洗个澡,吃顿早餐,让我十个月大的女儿准备好。她刚刚开始在crche工作,所以我们正在经历儿童一年内可能患上的10到12种病毒性疾病。这可能是一个挑战。8.30点小组与抗菌素耐药性和感染控制(AMRIC)

    2025年08月26日
    11
  • NHS数据显示:28%患者面临预约困难,亟需改善医疗服务

    最新数据显示,在萨福克郡和埃塞克斯东北部,近三分之一的患者无法预约NHS牙科服务。来自NHS满意度调查的数据显示,在过去两年中,28%的患者无法在NHS萨福克和东北埃塞克斯综合护理委员会覆盖的地区预约。在对NHS调查表格做出回应的5512名患者中,这

    2025年08月28日
    12
  • 城市交通管理策略:如何有效减少排放与改善空气质量

      游客们普遍认为都柏林是一个充满活力和传奇的文化中心。然而,对于当地居民和商家来说,出行却是一项挑战。“都柏林的交通状况真是糟糕,”位于市中心繁忙地带的咖啡馆GaillotetGray的联合创始人艾玛·格雷(EmmaGray)表示。研究显示,都柏林的交通拥堵在全球主要城市

    2025年08月29日
    10
  • 必看科普“雀神麻将开挂神器下载”(确实能开挂)

    您好:雀神麻将开挂神器下载这款游戏是可以开挂的,软件加微信【添加图中微信】确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别好,总是好牌,而且好像能看到其他人的牌一样。所以很多小伙伴就怀疑这款游戏是不是有挂,实际上这款游戏确实是有挂的,添加客服微信

    2025年08月29日
    11
  • 大同市北岳中学小学部国庆节放假安排及温馨提示详解

    <pclass="ql-block">尊敬的家长朋友们、亲爱的同学们:</p><pclass="ql-block">金秋十月迎国庆,举国同庆贺生辰。国庆节小长假到了👏👏👏,假期生活丰

    2025年09月01日
    11
  • 重大通报“红龙poker俱乐部辅助”其实是有挂

    亲,红龙poker俱乐部辅助这款游戏原来确实可以开挂,详细开挂教程1、起手看牌2、随意选牌3、控制牌型4、注明,就是全场,公司软件防封号、防检测、 正版软件、非诚勿扰。2022首推。全网独家,诚信可靠,无效果全额退款,本司推出的多功能作 弊

    2025年09月02日
    7
  • 中美新冠病例数对比:疫情应对的治理逻辑与分野分析

    新冠疫情自2020年初爆发以来,已成为全球性的健康危机和社会经济挑战,中国和美国作为世界上最大的两个经济体,其疫情应对策略和病例数据呈现出显著差异,截至2023年,美国累计报告新冠病例超过1亿例,而中国官方报告的病例数仅为约30万例,这种巨大差异不仅反映了两国在公共卫生政策、社会结构和文

    2025年09月05日
    4
  • 陕西省卫健委:12月20日新增43例本土确诊病例情况通报

    12月20日0-24时,新增报告本土确诊病例43例(西安市42例、咸阳市1例)。自12月9日以来,全省累计报告本土确诊病例96例(西安市91例、延安市3例、咸阳市2例)。12月20日0-24时,新增报告境外输入确诊病例1例,无症状感染者解除隔离1例。本土确诊病例1,男,45岁,现居咸阳市渭城区。在对

    2025年09月05日
    3

发表回复

本站作者后才能评论

评论列表(4条)

  • 曼山
    曼山 2025年09月03日

    我是利天创世的签约作者“曼山”!

  • 曼山
    曼山 2025年09月03日

    希望本篇文章《疫情数据查询与动态统计图的GUI实践:技术设计与数据加载挑战》能对你有所帮助!

  • 曼山
    曼山 2025年09月03日

    本站[利天创世]内容主要涵盖:国足,欧洲杯,世界杯,篮球,欧冠,亚冠,英超,足球,综合体育

  • 曼山
    曼山 2025年09月03日

    本文概览:import requests import xlwt import xlrd import re import sys import threading import os...

    联系我们

    邮件:利天创世@sina.com

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注我们