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("完成")
Python读取excel生成数据库表
最新推荐文章于 2024-06-16 14:54:47 发布