正文
一、缘起
事情是这样的,领导安排一个活,详细探查xx公司的数据治理,包括数据源,数据流,数据质量。
PS.工作量非常大,费劲整理出质量报告!
好的,没问题: 嘴上逞强,心在滴血!
二、转机
我一想,数据探查不就是看这些指标:
表名,列名,空值数量,总数据量,空值率,字符类型,字段长度,备注,主键,权限
既如此,何不用python?
于是乎,奋笔疾书!
三、成果
说干就干,最终用python 快速完成数据治理调研,而我,楼下遛弯去了~
但是,活可没马虎,给大家康康效果:
四、过程
为了让更多有数据处理需求的小伙伴,高效搞定工作,我觉得把相关代码完全开源,当然,也有提升的地方,希望小伙伴在评论区指指点点。
代码大致分为4个部分:
1、导包
#coding=utf-8 from __future__ import division import os,openpyxl,pymysql as MySQL
2.连接数据库
print("开始连接ing") try: conn=MySQL.connect(host="127.0.0.1",port=3306,user="root",passwd="root",db="tomato",charset='utf8') #charset解决字符乱码 except: print("连接失败!") cur = conn.cursor() print("连接成功!!!")
3、数据探查
#tab=['xxxxxx','bbbbbb'] #指定探索的表名 tab=[] if len(tab)==0 : quary="""show tables; """ ret=cur.execute(quary) ret=cur.fetchall() #结果是二层tuple for i in ret: tab.append(i[0]) print('表数量: %s'%len(tab)) print('表list: %s'%tab) else: pass m=1 result=[] result.append(['表名','列名','空值数量','总数据量','空值率','字符类型','字段长度','备注','主键','权限']) for i in tab: if m==100: break print(i) print("第" + str(m) + "个表") quary1="select count(*) from %s"%i retsc=cur.execute(quary1) retsc=cur.fetchall() quary2='''select COLUMN_NAME from Information_schema.columns where table_Name = '%s';'''%i ret1=cur.execute(quary2) ret1=cur.fetchall() for col in ret1: ll=[] quary3="""select count(*) from %s AS AAA where AAA.%s is null; """%(i,col[0]) print(quary3) ret2=cur.execute(quary3) ret2=cur.fetchall() quary4="""SELECT DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,COLUMN_COMMENT,COLUMN_KEY,PRIVILEGES from information_schema.COLUMNS where TABLE_NAME=\'%s\' and COLUMN_NAME=\'%s\';"""%(i,col[0]) print(quary4) re4=cur.execute(quary4) re4=cur.fetchall() print(re4) ll.append(i) ll.append(col[0]) ll.append(ret2[0][0]) ll.append(retsc[0][0]) try: ll.append(str(round(ret2[0][0]/retsc[0][0],2))) except: ll.append(0) ll.append(re4[0][0]) ll.append(re4[0][1]) ll.append(re4[0][2]) ll.append(re4[0][3]) ll.append(re4[0][4]) result.append(ll) m=m+1 print(result) cur.close() conn.close()
4、写excel
path='D:\\export' # 输入文件路径 print("请输入文件名,如不输入,默认文件名export: ") exportname=input() if exportname=='': exportname='export' if os.path.exists('%s\%s.xlsx'%(path,exportname)): os.remove('%s\%s.xlsx'%(path,exportname)) print('导出文件路径: %s\%s.xlsx'%(path,exportname)) os.chdir('%s'%path) inwb = openpyxl.Workbook() inwb.create_sheet('西红柿真帅',0) sheetname=inwb.get_sheet_names() inwb.remove_sheet(inwb.get_sheet_by_name(sheetname[1])) ws=inwb.get_sheet_by_name(sheetname[0]) for i in range(len(result)): for j in range(len(result[0])): ws.cell(row = i+1 , column = j+1).value = result[i][j] inwb.save('%s.xlsx'%exportname) print("success !!!")
数据质量调研搞完了,发给领导~