python 文字转表格 openpyxl

python文字转表格主要用到openpyxl模块。
主要的操作要两个,创建表格和写操作。
创建表格:

    book = Workbook()
    sheet = book.create_sheet(title='新数据表',index=0) #创建工作表格

插入:

    sheet.cell(row = 0, column = 0, value = 'data') #row是行,column 是列

保存:

    book.save('test.xlsx') #保存到test表格中 

除了与表格相关的操作之外,文字转表格需要用到正则表达式来提取文本中的相应内容。

    PATTERN = u'([\u4e00-\u9fa5]{1,5}?(?:省|州|区|市))' #搜索省市比如湖北省、北京市
    s = data.encode()
    data_utf8=s.decode('utf-8')
    pattern = re.compile(PATTERN)
    m = pattern.findall(data_utf8)
    print(m)

一下是我寒假做的一个工作,是帮助北京大学的数据可视化团队收集疫情数据时,用来整理湖北省的疫情数据的。
网站文本:

2020年4月27日0—24时,全省新增新冠肺炎确诊病例0例,无境外输入病例。

截至2020年4月27日24时,全省现有确诊病例0例,现有疑似病例0例。

全省累计报告新冠肺炎确诊病例68128例,其中:武汉市50333例、孝感市3518例、黄冈市2907例、荆州市1580例、鄂州市1394例、随州市1307例、襄阳市1175例、黄石市1015例、宜昌市931例、荆门市928例、咸宁市836例、十堰市672例、仙桃市575例、天门市496例、恩施州252例、潜江市198例、神农架林区11例。

全省累计治愈出院63616例,其中:武汉市46464例、孝感市3389例、黄冈市2782例、荆州市1528例、鄂州市1335例、随州市1262例、襄阳市1135例、黄石市976例、宜昌市894例、荆门市887例、咸宁市821例、十堰市664例、仙桃市553例、天门市481例、恩施州245例、潜江市189例、神农架林区11例。

全省累计病亡4512例,其中:武汉市3869例、孝感市129例、黄冈市125例、鄂州市59例、荆州市52例、随州市45例、荆门市41例、襄阳市40例、黄石市39例、宜昌市37例、仙桃市22例、咸宁市15例、天门市15例、潜江市9例、十堰市8例、恩施州7例、神农架林区0例。

全省累计追踪密切接触者282236人,尚在接受医学观察1696人。

4月27日,全省新增无症状感染者27例,转确诊0例,解除隔离10例,尚在医学观察的无症状感染者599例。

python代码:

#!/usr/bin/env python
#encoding: utf-8
#description: 从字符串中提取疫情对应的市、州人数
 
import re
import sys
import importlib
importlib.reload(sys)
from openpyxl import Workbook
import datetime
from time import time
import time
city={
    '武汉市':1,
    '孝感市':2,
    '黄冈市':3,
    '随州市':4,
    '荆州市':5,
    '襄阳市':6,
    '黄石市':7,
    '宜昌市':8,
    '荆门市':9,
    '鄂州市':10,
    '咸宁市':11,
    '十堰市':12,
    '仙桃市':13,
    '天门市':14,
    '恩施州':15,
    '潜江市':16,
    '神农架林区':17
}
numberAdjust= {
    0:8,
    1:11,
    2:10, 
    3:15,
    4:17,
    5:18
}
def datetime_analysis(array):
    data=' '.join(array)
    PATTERN = u'(\d{4}[\u4e00-\u9fa5]\d{1,2}[\u4e00-\u9fa5]\d{1,2}[\u4e00-\u9fa5])'
    s = data.encode()
    data_utf8=s.decode('utf-8') 
    pattern = re.compile(PATTERN)
    m = pattern.findall(data_utf8)
    datetime1=m[0]
    datetime1=datetime1.replace("年", "/").replace("月", "/").replace("日", " ").strip()
    n = datetime1.split('/')
    dateDif=int(n[2])
    dateDif=dateDif+1
    n[2]=str(dateDif)
    datetime2='/'.join(n)
    datetime1=datetime1
    datetime2=datetime2
    return datetime1,datetime2
def suspected_analysis(array):
    data=' '.join(array)
    PATTERN = u'疑似病例[\u4e00-\u9fa5]{0,2}\d{1,4}[\u4e00-\u9fa5]{0,1},当日[\u4e00-\u9fa5]{2,4}\d{0,4}[\u4e00-\u9fa5]{0,1},当日排除\d{1,4}人'
    s = data.encode()
    data_utf8=s.decode('utf-8') 
    pattern = re.compile(PATTERN)
    m = pattern.findall(data_utf8)
    #print(m)
    for i in m:
        n=re.findall("\d{1,4}",i)
    n= [int(x) for x in n]   
    return n
    
def asymptomatic_infection(array,datetime1):
    file = open('./asymptomatic_temp.txt')
    lines = file.readlines()
    file.close
    print(datetime1)
    print(lines)
    datetimeTemp=datetime1.split('/')
    print(datetimeTemp)
    datetime2=datetimeTemp[0]+'/'+datetimeTemp[1]+'/'+str(int(datetimeTemp[2])-1)
    PATTERN1 = datetime2+u':(\\d{1,4})'
    data1=' '.join(lines)
    s = data1.encode()
    data_utf8=s.decode('utf-8') 
    pattern1 = re.compile(PATTERN1)
    line = pattern1.findall(data_utf8)
    print(line)
    data=' '.join(array)
    PATTERN = u'新增无症状感染[\u4e00-\u9fa5]{0,2}\d{1,4}[\u4e00-\u9fa5]{0,1}.*解除隔离\d{0,4}例'
    s = data.encode()
    data_utf8=s.decode('utf-8') 
    pattern = re.compile(PATTERN)
    m = pattern.findall(data_utf8)
    print(m)
    for i in m:
        n=re.findall("\d{1,4}",i)
    n= [int(x) for x in n]  
    print(n)
    totalTemp=int(line[0])+n[0]
    f = open('./asymptomatic_temp.txt', 'a') #内容追加
    f.write('\n'+datetime1+":"+str(totalTemp)) #可写所有能迭代的类型,例如list
    f.close()
    res=[]
    res.append(n[0])
    res.append(totalTemp)
    res.append(n[2])
    return res
def creat_excel(sheet,array):
    colums=['序号','统计级别','数据起始时间','数据结束时间','国家','省份','城市','区县','新增确诊人数','新增疑似人数','新增治愈人数','新增死亡人数','新增无症状感染人数','新增无症状感染治愈人数','新增无症状感染死亡人数','累计确诊人数','累计疑似人数','累计治愈人数','累计死亡人数','累计无症状感染人数','累计无症状感染治愈人数','累计无症状感染死亡人数','核减人数','累计核减人数','数据源','数据发布时间','数据源文本','数据源链接','数据间接发布时间','数据间接发布来源','数据间接发布来源链接','数据收集时间','数据收集方式','数据收集人员/程序姓名','数据是否核查','数据首次核查时间','数据首次核查方式','数据首次核查人员/程序姓名','数据首次核查状态','更正人员','更正时间','数据再次核查时间','数据再次核查方式','数据再次核查人员/程序姓名','数据再次核查状态','备注']
    data=' '.join(array)
    datetime1,datetime2=datetime_analysis(array)
    datetime3=datetime1+' 9:00'
    datetime4=datetime.datetime.now().strftime("%Y/%m/%d %H:%M")
    suspectedCase=suspected_analysis(array)
    if(len(suspectedCase)>2):
        suspectedCaseTotal=suspectedCase[0]
        suspectedCaseAdd=suspectedCase[1]-suspectedCase[2]
    else:
        suspectedCaseTotal=suspectedCase[0]
        suspectedCaseAdd=0
    asymptomatic=asymptomatic_infection(array,datetime1)
    
    #url=array[0]
    columsDefault = {
        1:'城市级',
        2:datetime1,
        3:datetime2,
        4:'中国',
        5:'湖北省',
        24:'湖北省卫健委',
        25:datetime3,
        26:data,
        27:'http://wjw.hubei.gov.cn/fbjd/dtyw/index.shtml',
        31:datetime4,
        32:'手动',
        33:'林增敏',
        34:'已核查',
        35:datetime4,
        36:'手动',
        37:'林增敏',
        38:'核查通过'}
    citys=['武汉市','孝感市','黄冈市','随州市','荆州市','襄阳市','黄石市','宜昌市','荆门市','鄂州市','咸宁市','十堰市','仙桃市','天门市','恩施土家族苗族自治州','潜江市','神农架林区','监狱系统','地区待确定']   
    for i in range(0,len(colums)):
        sheet.cell(row = 1, column = i+1, value = colums[i])
        if(i in columsDefault):
            for j in range(1,len(citys)+2):
                sheet.cell(row = j+1, column = i+1, value = columsDefault[i])
    sheet.cell(row = 21, column = 2, value = '省级')
    sheet.cell(row = 21, column = 24, value = -1132)
    sheet.cell(row = 21, column = 10, value = suspectedCaseAdd)
    sheet.cell(row = 21, column = 17, value = suspectedCaseTotal)
    sheet.cell(row = 21, column = 13, value = asymptomatic[0])
    sheet.cell(row = 21, column = 14, value = asymptomatic[2])
    sheet.cell(row = 21, column = 20, value = asymptomatic[1])
    sheet.cell(row = 20, column = 13, value = asymptomatic[0])
    sheet.cell(row = 20, column = 14, value = asymptomatic[2])
    sheet.cell(row = 20, column = 20, value = asymptomatic[1])
    for i in range(1,len(citys)+1):
        sheet.cell(row = i+1, column = 7, value = citys[i-1]) 
def text_analysis(sheet,array): 
    PATTERN = u'([\u4e00-\u9fa5]{1,5}?(?:省|州|区|市))(\\d+)'
    PATTERN1 = u'([\u4e00-\u9fa5]{1,3}市(?:和|、){0,1}?)+(?:均为|各)(\\d+)'
    PATTERN2 = u'([\u4e00-\u9fa5]{2}市)'
    count=0
    for data in array:
        s = data.encode()
        data_utf8=s.decode('utf-8')
        #print(data_utf8)
        pattern = re.compile(PATTERN)
        m = pattern.findall(data_utf8)
        sum=0
        for date2 in data_utf8.split(','):
            pattern1 = re.compile(PATTERN1)
            m1 = pattern1.search(date2)
            if(m1):
                #print(m1.group(0))
                pattern2 = re.compile(PATTERN2)
                m2 = pattern2.findall(m1.group(0))
                number=re.findall('\\d+',m1.group(0))
                for data3 in m2:
                    tup=(data3,number[0])
                    m.append(tup)
        print(m)
        for i in m:
            #print(i[0]+" "+i[1]) 
            if(i[1]!='0'):
                sheet.cell(row = city[i[0]]+1, column = numberAdjust[count]+1, value = int(i[1]))
                sum=sum+int(i[1])
        if(count!=6):
            sheet.cell(row = len(city)+4, column = numberAdjust[count]+1, value = sum)
            count=count+1 

if __name__ == '__main__':
    with open('.\data.txt','r',encoding='UTF-8') as lines:  #一次性读入txt文件,并把内容放在变量lines中
        data=lines.readlines()  #返回的是一个列表,该列表每一个元素是txt文件的每一行 
    book = Workbook()
    sheet = book.create_sheet(title='新数据表',index=0) #创建工作表格
    array=[]
    for i in data:
        if(i!='\n'):
            array.append(i)
    creat_excel(sheet,array)
    text_analysis(sheet,array)
    #日期格式化
    datetime1,datetime2=datetime_analysis(array)
    datetime1=datetime1.replace("/", "-").strip()
    y = datetime.datetime.strptime(datetime1, '%Y-%m-%d')
    detester = y.strftime('%Y-%m-%d')
    datetime1=detester.replace("-", "").strip()
    provinceName='hubei'
    fileName=provinceName+'CaseStatistics_'+datetime1+'.xlsx'
    book.save(fileName) #保存到test表格中 

效果图:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值