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表格中效果图: