疫情数据查询与动态统计图的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://www.yqlvyou.com/zskp/202509-5718.html

(12)

文章推荐

  • 越南农民因洪水失去庄稼,鲜花随之凋零

      越南农民DoHongYen估计,她宝贵的桃花作物被河内20年来最严重的洪水淹没,损失了数万美元。在台风袭击的越南北部,超过25万公顷的农作物被毁,包括水稻、蔬菜和果树。在河内北部,损失最严重的是种植桃花的农民。在越南农历新年春节之前,每棵桃花的价格最高可达400美元。“我失

    2025年08月04日
    11
  • 露易丝·汤普森在安装造口袋三个月后达成人生重要里程碑

    露易丝·汤普森在经历了挽救生命的手术三个月后,迎来了一个巨大的里程碑。这位前切尔西球星在经历了一系列健康问题后,最近向球迷敞开了心扉。本月早些时候,这位34岁的歌手告诉粉丝,她已经做了手术,装了一个造气孔袋。上周,露易丝第一次在社交媒体上向粉丝们展示了她的胃袋。周末

    2025年08月06日
    15
  • 分享科普“wepoker辅助下载”(其实是有挂)

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

    2025年08月25日
    10
  • 玩家综述“微乐麻将开挂器通用版有没有效果”详细分享装挂步骤

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

    2025年08月26日
    13
  • 教程解析“微信拼三张透视插件怎么用”的确是有挂

    家好,今天小编来为大家解答微信拼三张透视插件怎么用有没有挂这个问题咨询软件客服可以免费测试,微信拼三张透视插件怎么用的挂在哪里买很多人还不知道,现在让我们一起来看看吧!一、微信拼三张透视插件怎么用记牌器怎么全显示你需要获得记牌器才能全部显示,否则只显示前

    2025年08月27日
    12
  • 北马里亚纳群岛的谋杀与溺水事件

    在北马里亚纳群岛塞班岛的隐蔽海滩附近,一只矛鱼被发现死在水中。北马里亚纳警方报告说,在2024年的头几天发生了一起谋杀案和一起水死案。周三,一名男子疑似在塞班岛隐蔽海滩附近溺亡。22岁的特拉文·基图瓜和一个同伴一起用鱼叉捕鱼

    2025年08月30日
    9
  • 燕子山诗词稿·庚子稿:五言律诗的艺术魅力

    柳芽滋长,新绿可人,蓦然惊见,春满半空矣。回首客岁,了无建树,而不至于两手空空者,惟效颦诗词数百篇而已。固是敝帚,敢抱自矜,只稍加检汰,不复修饰,粗分为绝句、律诗、词三部,聊布存念,并贺新春,倘遇一二同好瞩目,则更侥幸而窃风

    2025年08月31日
    13
  • 【紧急提示】鸡西市疾病预防控制中心发布第九十八期行程轨迹信息!

      广大鸡西市民:  11月20日,上海市新增2例确诊病例。11月21日上午,浦东新区周浦镇明天华城小区列为中风险地区,上海市其他区域风险等级不变。  为了您和他人的安全和健康,如果与上海市确诊病例行程轨迹有交集,特别是11月6日以来到过上海浦东新区周浦镇、浦东新区周浦医院、上海

    2025年09月01日
    10
  • 山西太原疫情现状及防控措施全面分析

    1、自4月13日山西省太原市清徐县清查出7例核酸检测初筛呈阳性人员以后,人民日报身心健康手机客户端新闻记者不彻底统计分析,截止到4月19日晚18点,山西太原清徐县“快递公司新冠疫情链”导致超143人感柒,涉及到山西省忻州市繁峙县,山西省晋中市榆次区、太谷区等,并外流

    2025年09月03日
    8
  • 包头市疫情最新消息:今天的防控动态与措施分析

    请广大群众搞好自我防护,与此同时密切关注诊断病案以及密切接触者的路程运动轨迹,若有联系,第一时间积极向所属街道社区(城镇)、小区(村)、所在单位或所住宾馆上报,相互配合贯彻落实健康监测、核酸检测、防护密切接触等管控措施

    2025年09月04日
    11

发表回复

本站作者后才能评论

评论列表(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,节假日休息

    关注我们