Python3是趋势,但是新浪SAE平台的便宜点的微服务,是Python2.7的。所以以下代码的环境是Python2.7.
原理是,一些关于政策的表,以这种Excel的方式存储在文件夹中:
创建一个类,并将主要的信息进行清洗后存入相关列表。将这个列表传入服务器,并将其渲染在模板中。
- 数据类的建立。虽然传入的是身份证号,但实际上是以户为单位展示信息,所以每一户唯一的标识就是户的编号。将户编号的相应列表的每一行都渲染在网页中。
#/usr/bin/env python
# -*- coding: UTF-8 -*-
import pandas as pd
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import os
import numpy as np
infoBasicPath = u'?????.xls' #数据的来源表
moneyMessagePath = u'???' #政策的来源是这个文件夹
name = u'身份证号' #查询是判断身份证号(姓名有重复,其他信息不利于准确查询,此处
checkID = u'户编号' #是以户编号为基础进行查询的
#获得顶部显示信息
class message(): #message类获得全部要查询的信息
huNumber = '' #户编号变量
messageTop = '' #用于展示在网页顶端的字符串
messTableList = [] #详细信息的dataframe,以列表形式存储在这个列表里
#fileNamePrint = ''
def basicMessage(self,idNum): #获得基本信息,也就是户主姓名,脱贫年度等信息
messageTable = pd.DataFrame(pd.read_excel(infoBasicPath)) #读取excel信息,并转化为dataframe
messageTable[name] = messageTable[name].apply(lambda x: str(x)[:18].upper()) #将身份证号全部变为大写
idNum = str(idNum) #字符串化,否则可能出现自动识别为数字的情况
if idNum!='':
idNum = str(idNum)[:18].upper() #将用户输入的身份证号的x变为大写
try:
mask = messageTable[name].isin([idNum]) #如果身份证号在这个dataframe里,那么将读取这行的姓名 和 脱贫年度等信息,并组合为字符串
littleData = messageTable[mask]
littleData = littleData.reset_index() #抛弃原来的索引,重新建立索引
huzhuName = str(littleData[u'姓名'][0])
outYear = str(littleData[u'脱贫年度'][0])
self.messageTop = u'姓名:'+huzhuName+u' 脱贫年度:'+ outYear
self.huNumber = str(littleData[u'户编号'][0])
except:
self.messageTop = u'无信息'
return self.messageTop
def moneyTable(self): #输入身份证号,获得户编号之后,执行此函数,得到享受所有的政策
if self.huNumber != '':
for filename in os.listdir(moneyMessagePath): # 读取文件名称,读取所有享受政策的文件
if filename[-3:] == 'xls':
targetPath = moneyMessagePath + '/' + filename # 构造文件夹内每一个文件的绝对路径
detailTableAll = pd.DataFrame(pd.read_excel(targetPath,dtype='str')) #以文本形式读取,避免出现电话号码后面出现.0
mask = detailTableAll[checkID].isin([self.huNumber]) #获取户编号所在的索引
littleData = detailTableAll[mask] #以索引方式获得户主户编号的所有dataframe
littleData = littleData[littleData.columns.drop(list(littleData.filter(regex=checkID)))] #删除户编号所在的列(checkID就是户编号)
if littleData.empty!=True: #如果得到的dataframe不为空,则清洗数据,并添加到列表中
littleData = littleData.replace('0', np.nan) #将数值0 统一变更为空值 np.nan是空值
jisuanData = littleData.drop([u'人数',u'与户主关系'], 1)
shengyuData = jisuanData.dropna(axis=1,how='all') #删除全部为Nan的列
nanData = shengyuData.drop(['Name'], 1) #删除name列,获得纯值的表
haveData = nanData.dropna(axis=0,how='all') #删除空值行,获得有值的表
realDataList = haveData.index.tolist() #获得有值的表格的索引列表
realData = shengyuData.loc[realDataList, :] #获得纯数据的dataframe
realDataShow = realData.replace(np.nan,'') #将空值统一改为 空
if realDataShow.empty == False:
self.messTableList.append(realDataShow)
return self.messTableList
- 这个数据传入flask服务器。
#/usr/bin/env python
# -*- coding: UTF-8 -*-
from flask import Flask,redirect
from flask import render_template
from flask import request,url_for
import newsMessage
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
#以上代码保证flask正常显示中文
app = Flask(__name__)
@app.route('/',methods=['POST','GET']) #以post 和 get方式获取数据
def index():
if request.method == 'POST': #用post方法获取html中的数据,也就是传入数据
searchID = request.form.get('searchInput') #获得文本框传入的数据
if len(str(searchID))>17: #若输入的身份证号大于
contClass = newsMessage.message() #实例化类
oneMess = contClass.basicMessage(searchID) #获得信息字符串
del contClass.moneyTable()[-len(contClass.moneyTable()):] #清空列表所有元素,不染
oneList = contClass.moneyTable() #将实例中列表元素清除之后,再获取新的内容
return render_template('index.html',content = oneMess,dataList = oneList) #向模板中传入数据
else:
return redirect(url_for('index')) #如果身份证号输入有误,则重新定位到index
return render_template('index.html', content='',dataList = '') #渲染模板 空值
if __name__ == '__main__':
app.run()
flask模板的渲染。
<nav id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>
<a>{{ content }}</a>
</li>
</ul>
<!-- mega-menu End -->
</nav>
<div class="col-md-7 col-sm-7 col-xs-12">
<div class="romana_domain_search">
<form action="{{ url_for('index') }}" method="POST">
<div class="romana_search_input">
<input type="text" name='searchInput' id="searchInput" placeholder="请输入姓名">
</div>
<div class="romana_search_submit">
<input type="submit" value="搜索">
</div>
</form>
</div>
</div>
<div class="table_contant">
<p>这里写基本内容 132627196301132826</p>
<div>
{% for k in dataList %}
<table border="1">
<tr>
{% for lieName in k.columns.values.tolist() %}
<th>{{ lieName }}</th>
{% endfor %}
</tr>
{% for dataJutiList in k.values.tolist() %}
<tr>
{% for cX in dataJutiList %}
<td>{{ cX }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
<p>---------</p>
{% endfor %}
</div>
</div>
最终效果: