定时的实现方式之一,excel入库

# -*- coding: utf-8 -*-
import pymysql
import xlrd
import uuid
import os
import re
import time
from xlrd import XLRDError

# 数据库配置
MYSQL_HOST = "mysql对应的云服务器的地址"
MYSQL_DATABASE = "数据库名称"
MYSQL_USER = "用户名"
MYSQL_PASSWORD = "密码"
MYSQL_PORT = 8029#端口


area_map={
"鲍山分局":"历城区",
"高新技术产业开发区分局":"历城区",
"公共交通分局":"市中区",
"槐荫区分局":"槐荫区",
"历城区分局":"历城区",
"历下区分局":"历下区",
"南部山区分局 ":"历城区",
"山东省济阳县公安局":"济阳区",
"山东省平阴县公安局":"平阴县",
"山东省商河县公安局":"商河县",
"山东省章丘市公安局":"章丘区",
"市中区分局":"市中区",
"天桥区分局":"天桥区",
"长清区分局":"长清区",
"山东省济南市公安局历下区分局":"历下区",
"山东省济南市公安局市中区分局":"市中区",
"山东省济南市公安局槐荫区分局":"槐荫区",
"山东省济南市公安局天桥区分局":"天桥区",
"山东省济南市公安局历城区分局":"历城区",
"山东省济南市公安局长清区分局":"长清区",
"山东省济南市公安局南部山区分局":"历城区",
"山东省济南市公安局高新技术产业开发区分局":"历城区",
"山东省济南市公安局鲍山分局":"历城区",
}

class MysqlHelper(object):
    def __init__(self):
        self.__host = MYSQL_HOST
        self.__user = MYSQL_USER
        self.__database = MYSQL_DATABASE
        self.__port = MYSQL_PORT
        self.__password = MYSQL_PASSWORD
        self.__conn = pymysql.connect(host=self.__host, user=self.__user, password=self.__password,
                                      database=self.__database, charset='utf8', port=self.__port)
        self.__cursor = self.__conn.cursor()

    def mysql_insert(self, sql, data):
        self.__cursor.execute(sql, data)
        self.__conn.commit()

    def mysql_query(self, sql, str=''):
        if (str != ''):
             self.__cursor.execute(sql, str)
             return self.__cursor.fetchall()
        else:
             self.__cursor.execute(sql)
             return self.__cursor.fetchall()

    def mysql_update(self, sql, str=''):
        try:
            result = self.__cursor.execute(sql, str)
            self.__cursor.commit()
        except Exception:
            self.__conn.rollback()
            print("发生异常")
        return result

    def close(self):
        self.__cursor.close()
        self.__conn.close()

    def prepare_insertsql(self, tablename, dict_data={}):
        # 数据库中表对应的键值
        keys = ",".join(dict_data.keys())
        # 数据库中对应的键值个数
        values = ",".join(['%s'] * len(dict_data))

        sql = r"insert into %s (%s) VALUES (%s)" % (tablename, keys, values)
        return sql

    def prepare_data(self, dict_data={}):
        data = tuple([pymysql.escape_string(one) for one in dict_data.values()])
        return data


class ExcelHelper(object):
    def __init__(self, filepath):
        try:
            self.work_book = xlrd.open_workbook(filepath,
                                                encoding_override='utf-8')
        except XLRDError as e:
            print(e)

    def get_content(self, sheet_index, row_num, kwargs={}):
        '''
        读取excel的内容
        :param sheet_index:sheet页位于第几个
        :param row_num :从第几行开始
        :param kwargs: 传递对应的数据库中的字段的字典表,
        键表示对应的数据库中的字段的名称,值表示对应的excel中的列号,从0开始,值必须是int类型
        :param length: 传递excel每行的个数
        :return:
        '''
        for i in range(row_num, self.work_book.sheet_by_index(sheet_index).nrows):
            dict_map = {}
            data_excel = self.work_book.sheet_by_index(sheet_index).row_values(i, 0, self.work_book.sheet_by_index(
                sheet_index).row(i).__len__())
            for key in kwargs.keys():
                if isinstance(kwargs.get(key), int):
                    dict_map[key] = str(data_excel[kwargs.get(key)])
                else:
                    dict_map[key] = eval(kwargs.get(key))
            yield dict_map


def getFileDataTime(filename):
    '''
    文件名称如:入住人数及来源国_20180618.xls
    :param filename:
    :return:
    '''
    result=re.match(".*?_(\d*).xls",filename)
    time_num=result.group(1) if result is not None and len(result.group(1)) != 0 else None

    if not time_num:
        return None
    else:
        reslt = time.strptime(time_num, "%Y%m%d")
        return time.strftime("%Y-%m-%d", reslt)



if __name__ == '__main__':
    excel_dir = ""
    while True:
        if not os.path.isdir(excel_dir):
            excel_dir= input("请您输入文件存放的文件夹:")
        else:
            break

    excel_helper=None
    mysql_helper=None

    while True:

        while True:
            #获取文件的具体位置
            dirs=os.listdir(excel_dir)
            if len(dirs)==0:
                print("文件还未进行上传,请尽快上传文件,程序将要执行下一个周期!")
                break
            dirs=sorted(dirs,reverse=True)#降序排序
            excel_path=os.path.join(excel_dir,dirs[0])#文件名称合并

            if not excel_helper:
                excel_helper = ExcelHelper(excel_path)
            if not mysql_helper:
                mysql_helper = MysqlHelper()

            #获取文件对应的数据日期
            timeData = getFileDataTime(dirs[0])
            if timeData:
                sql="SELECT MAX(t_date) FROM t_po_hotelportrait"
                #如果表中没有数据将会获得None
                max_date=mysql_helper.mysql_query(sql)

                #如果数据是最新的数据,则插入数据
                if max_date[0][0] and max_date[0][0]<timeData:
                    map_dict = {'t_id': "uuid.uuid1().hex", 't_policeName': 0, 't_hotelName': 1, "t_sex": 2,
                                "t_cardNo": 3, "t_num": 4}
                    # 第一个sheet也的第一行开始
                    for dict_data in excel_helper.get_content(0, 1, map_dict):

                        # 设置酒店所处的城市名称
                        dict_data['t_cityName'] = "济南"

                        # 设置酒店所处的区县名称
                        hotel_district=""
                        for key in area_map.keys():
                            if key in  dict_data.get("t_policeName"):
                                hotel_district=area_map.get(key)
                                break
                        dict_data['t_districtName'] = hotel_district

                        # 为数据赋值时间
                        dict_data['t_date'] = timeData

                        sql = mysql_helper.prepare_insertsql("t_po_hotelportrait", dict_data)
                        data = mysql_helper.prepare_data(dict_data)
                        mysql_helper.mysql_insert(sql, data)
                        print("正在%s导入%s 的数据 数据为:%s"%(timeData,dict_data.get("t_hotelName"),dict_data))
                    print("%s 数据导入完成"%(timeData,))
                    break
                else:
                    print("%s 今天没有新数据导入"%(timeData,))
                    print("程序将要等待下一个周期执行,程序窗口不能关闭!")
                    break
            else:
                print("%s excel文件时间命名不对,请按照格式命名,程序将在5秒后关闭" % (timeData,))
                time.sleep(5)
                exit()

        time.sleep(60*24*60)

转载于:https://my.oschina.net/jiansin/blog/2243699

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值