python数据处理到进入mysql的ods层

这是一个简单的python处理excel文件入库的项目。主要是为了处理整合一大堆excel到数据库里面,方便后续的数据处理和可视化。(代码能力有限~还希望大家多多指教,希望能得到大佬们的指点)
ps:下面的过程只做主要流程的代码说明,具体的数据处理细节就不多写啦,就是pandas的各种用法。

1. 数据链路(数据流转过程)
从excel经过python处理后进入数据库etl层(同时处理完的excel数据自动保存在另外的一个文件夹中做历史存储),然后通过数据库的不重复插入操作进入到ods层。

2. 数据读入和部分有趣的处理代码:

数据读入:

import pandas as pd 
import os

path_of_origin = r'//Desktop-6meit9b\共享文件夹'  #这里是共享文件夹的路径,如果要读取共享文件夹记得路径前面加上"//"
filenames = os.listdir(path_of_origin)

for filename in filenames:                         #循环输出一下路径文件夹下面的所有文件名
    print(filename)

for i in filenames:								  #循环读取一下文件名
    if i[:2] == '~$':							  #这里是为了去掉隐藏文件?不知道为啥会多了这个不用的文件,所以直接删
        continue
    excel_path = path_of_origin + '\\' + i        #将文件名赋值到新的路径中,后续直接用pandas读取文件
    try:      									  #这里用try来读取csv和xlsx文件。存在两种格式,所以得用两个不同方式。
        data = pd.read_csv(excel_path)     
    except:
        data = pd.read_excel(excel_path)
    df.append(data)                  			  #append一个个dataframe
df = pd.concat(df)							      #把一个大dataframe里面很多个小dataframe整合成一个

数据处理(删掉emoji表情)

import re
def filter_emoji(content):  #删除emoji表情包
	new_content = re.sub('[^\\u0000-\\uFFFF]', '', content)
	return new_content
#删掉emoji表情
df['market_plan'] = df['market_plan'].apply(lambda x:filter_emoji(x))  #我这一列里面有emoji表情包,导致无法直接进入数据库,由于表情包于我无用,所以我选择删掉表情包,如果有需要也可以去更改数据库配置。具体怎么配置就请上网百度了~	

3. 数据入库后已处理的excel文件转移位置且保存:
由于我的设计是脚本读取指定的文件路径,所以我在处理完该文件夹下的所有文件后,选择把文件转移到另外的文件夹下进行储存,下次再处理的时候就不会重复处理已入库的文件了。
ps:数据库处理方式放到后面去。。。这里先写单纯python处理的东西

def mkdir(path):    #根据时间创建文件夹
    # 引入模块
    import os
    import time
    # 去除首位空格
    time_ticket = '历史储存(' + str(time.strftime("%Y%m%d-%H%M%S"))  +')'  #储存的文件夹会根据时间来新创建
    path = os.path.join(path, time_ticket) 
    path = path.strip()
    # 去除尾部 \ 符号
    path = path.rstrip("\\")
    # 判断路径是否存在
    isExists = os.path.exists(path)
    # 判断结果
    if not isExists:
        # 如果不存在则创建目录
        # 创建目录操作函数
        os.makedirs(path)
        print('创建成功: ' + path)
        return path   #return 创建成功的文件路径,后面用于remove_file


def remove_file(old_path, new_path):    #移动已处理过的文件到新的文件夹里面
    import shutil
    import os
    print(old_path)
    print(new_path)
    filelist = os.listdir(old_path) #列出该目录下的所有文件,listdir返回的文件列表是不包含路径的。
    print(filelist)
    for file in filelist:
        src = os.path.join(old_path, file)
        dst = os.path.join(new_path, file)
        print('src:', src)
        print('dst:', dst)
        shutil.move(src, dst)

path_of_origin = r'//Desktop-6meit9b\指定读取的文件夹名字'
path_for_storage = r'//Desktop-6meit9b\选择储存的文件夹名字'
remove_file(path_of_origin, mkdir(path_for_storage)) #创建一个新文件夹,并把旧路径下面的所有文件转移到新文件夹里面

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

4. 数据入库:
我选择入库的是mysql。这里建议用读取文件的方式来获取数据库账号密码,然后创建session是因为insert了数据,这边要进行commit数据库才能真正写入数据。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

#从指定文件中读取sql链接信息并建立链接
conndf = pd.read_csv(r'D:\software\mysql-8.0.19-winx64\conn_etl.txt', header = None)
connstr = conndf.iloc[0,0]
yconnect = create_engine('mysql+mysqldb://' + connstr + '?charset=utf8')
#创建会话联通数据库
Session = sessionmaker(bind=yconnect)
session = Session()

#插入前先清空etl表内数据 (mysql操作)      
con = yconnect.connect()
con.execute('truncate table etl_tablename')   #清空对应表数据
con.close()    

#将数据写入mysql的数据库
pd.io.sql.to_sql(df,'etl_tablename', yconnect, schema='gr_etl', if_exists='append')
    
#执行存储过程,插入非重复数据进入ods
session.execute('call pro_procedurename')   #调用存储过程
session.commit()   #提交更改
session.close()  #记得关闭会话

存储过程创建:
我的数据库这边进入要用两层来处理,一开始进入是etl,然后经过添加uuid并使用insert ignore来避免重复插入,进入到ods层。md5(concat(idea_id, date)) 这个是最重要的地方,可以使用md5来并指定相关唯一字段来生成对应的md5码,创建uuid。必须这样才能使用insert ignore,这个方法是基于主键唯一来使用的。
ps:建表语句我就不放了,比较简单,注意ods需要多设置一个uuid并命其为主键。

DELIMITER $$
CREATE PROCEDURE pro_procedurename()
BEGIN
	insert ignore into gr_ods.ods_tablename(
		u_id 				
		,`date` 					
		,market_plan				
		,plan_id					
		)
	select 
		md5(concat(idea_id, `date`)) 				  				
		,`date` 					
		,market_plan				
		,plan_id								
	from gr_etl.etl_tablename;
END$$
DELIMITER ;

目前就这么多了。。后续可能会补更一下kettle串联调度整个项目,目前还没搞定就先这么多了。。。比较菜,有什么好的意见希望大神们多多指点~~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值