Python读取excel生成数据库表

import sys

import pandas as pd
import pypinyin
import datetime
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,String,Integer,DateTime
from urllib import parse


#host = sys.argv[1]
#port = sys.argv[2]
#database = sys.argv[3]
#username = sys.argv[4]
#bad_password = sys.argv[5]
#password = parse.quote_plus(bad_password)
#file = sys.argv[6]
#tableName = sys.argv[7]
#period = sys.argv[8]
#edition = sys.argv[9]

host = "47.92.115.224"
port = "3306"
database = "rcjj"
username = "root"
bad_password = "Charsming619"
password = parse.quote_plus(bad_password)
file = "C:/Users/charsming/Desktop/统计局/核算/核算.xls"
tableName = "tjjhs"
edition = "2021-10"
period = "v1"


datakeys = []
dict = {}
ts = []


editions = []
periods = []

#当前时间
dateTime_p = datetime.datetime.now()
timec =datetime.datetime.strftime(dateTime_p,'%Y-%m-%d %H:%M:%S')

if __name__ == "__main__":
    engine = create_engine("mysql+pymysql://{}:{}@{}:{}/{}".format(username, password, host, port, database))



# 解析excel
    df = pd.read_excel(file)

    # pandas读取方法的具体用途 可以自行学习,主要包括打开excel 、sheet指定 数据读取
    # 按行取数 如果表格数据是标准二维表 可以在read_excel时指定开始读取数据的位置 这个读取后可以直接通过df to sql入库
    # 这里测试用的表格是 科技局的 	主要经济指标数据目录明细(科技局)0809.xls
    #data = df.iloc[2]
    #异形表格 可以直接指定读取单元格
    #celldata=df.iloc[[2], [3]]
    
    #获取表中第1行以下的数据
    data = df[1:]
    #获取表中的中文字段名
    keys1 = data.iloc[0]
    keys = keys1[1:]


    #获取data中第1行以下的数据
    data = data[1:]

   # print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) 
    #获取表中的列数
    columnnum = data.shape[1]-1
    rows = data.shape[0]-1

    #创建两列自定义字段:时间,版本
    for i in range(rows):
        ts.append(timec)
        editions.append(edition)
        periods.append(period)
        

    #将获取到的中文字段名转成拼音首字母,作为数据表中的字段名
    for key in keys:
        key = key.replace(' ','')
        chinesekey = pypinyin.pinyin(key, style=pypinyin.FIRST_LETTER)
        initials = []
        for i in range(len(chinesekey)):
            #initials.append(str(chinesekey[i][0]).upper()) 大写
            initials.append(str(chinesekey[i][0]))
        key = ''.join(initials)
        datakeys.append(key)

    #通过循环将字段名和该字段对应的数据插入到yhon字典(Dictionary)中
    for i in range(columnnum):
        dict.update({datakeys[i]:data.iloc[1:,i]})

    #将创建的两列自定义字段查到dict中
    dict.update({'ts':ts})
    dict.update({'edition':editions})
    dict.update({'period':periods})
    

# 创建数据表 写在这里 这样不需要再单独建表
# 不用担心存在的时候会覆盖 这个没问题

    Base = declarative_base()

    class User(Base):  # 继承生成的orm基类
        __tablename__ = tableName  # 表名
        id = Column(Integer, primary_key=True)  # 设置主键
        ts = Column(DateTime)
        edition = Column(String(32))
        period = Column(String(32))
    for datakey in datakeys:
        setattr(User,datakey,(Column(String(32))))
       
    Base.metadata.create_all(engine)

# 存在数据库里

# 新建DataFrame
    #df_write = pd.DataFrame({'name': ['张三', '李四', '王五', '赵六'], 'score': [80, 75, 56, 99]})
    df_write = pd.DataFrame(dict)

# 将df储存为MySQL中的表,不储存index列
    df_write.to_sql(tableName, engine, if_exists='append', index=False)

# 用完了一定要关闭数据库连接 否则数据库要挂掉
    engine.connect().close()
    engine.dispose()
# pirnt用于向java端输出 比如导出时的文件路径等
    print("完成")

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yzhSWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值