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