栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

关于Excel表操作-写入数据库操作

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于Excel表操作-写入数据库操作

Excel表要写入数据库,毕竟通过pandas来操作复杂的数据还是很有难度的,有多少种数据库,就有多少种数据库引擎,要下载多少python数据库包,同样对Excel写入数据库的操作,可以基于excel按行写入,也可以通过pandas处理,但pandas处理效率不高。

基于openpyxl写入数据的操作包括,以下几步

1、基于表名构造一个绑定变量的SQL

2、读取excel表,转换为list

3、逐行写入,最后提交

踩坑如下:

cx_Oracle.DatabaseError: DPI-1043:invalid number一般是excel表出现空值

还有就是一些生僻的汉字写入数据库的时候,报汉字编码错误,没找到合适的解决办法。

import cx_Oracle
import pandas as pd
from sqlalchemy import create_engine
from sqlalchemy import types
import openpyxl
sheetname='Sheet0'
resourcefilenames=[r'C:UsersbaoqiDocuments文件1.xlsx',
               r'C:UsersbaoqiDocuments文件2.xlsx',
               r'C:UsersbaoqiDocuments文件3.xlsx',
               r'C:UsersbaoqiDocuments文件4.xlsx'
desttablename=['table1','table2','table3','table4']
def get_sql(cursor,tablename):
    cursor.execute("select column_name from user_tab_columns where table_name = upper('{}')".format(tablename))
    res=c.fetchall()
    res = [a[0] for a in res]
    fieldname=','.join(res)
    colnum=len(res)
    zwf=[':'+str(i+1) for i in range(colnum)]
    zwf=','.join(zwf)
    SQL = "INSERT INTO {} ({}) VALUES({})".format(tablename, fieldname, zwf)
    print(SQL)
    return SQL

conn_str = cx_Oracle.makedsn('127.0.0.1', '1521', service_name='ORCL2') # 数据库信息,注意是service_name,非SID
conn = cx_Oracle.connect(user='username', password='password', dsn=conn_str) # 用户信息
c = conn.cursor() #创建连接
for i, filename in enumerate(resourcefilenames):
    print('处理第{}表,库表为{},excel名称为{}'.format(i,desttablename[i],filename))
    sql=get_sql(c,desttablename[i])
    # 解决 cx_Oracle.DatabaseError: DPI-1043:invalid number 问题
    pddata = pd.read_excel(filename, header=0, engine="openpyxl").fillna('-')
    datalist = pddata.values.tolist()
    for data in datalist:
        c.execute(sql,tuple(data))
    conn.commit()
c.close()

基于pandas写入数据库,一定要使用sqlalchemy,操作比较简单,但效率较低。

import cx_Oracle
import pandas as pd
from sqlalchemy import create_engine
from sqlalchemy import types
import openpyxl

filename = r'C:UsersbaoqiDocumentstest.xlsx'
conn_string='oracle+cx_oracle://user:pass@host:port/dbname'
engine = create_engine(conn_string, echo=False)
pddata = pd.read_excel(filename, header=0, engine="openpyxl")
pddata.to_sql('testtest', con=engine, if_exists='append', index=False,dtype={})

最后,谢谢关注,谢谢支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/844043.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号