利用Python將EXCEL,CSV,TSV導入Oracle或者MySQL

雖然可以用Kettle等ETL工具將EXCEL,CSV,TSV等格式的文件導入Oracle或者MySQL,但是還是覺得寫點代碼心裏踏實些

import cx_Oracle
import pymysql
import pandas
import os
import time
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
target_db_type='Oracle'                                                     #如果想導入MySQL,修改這裏爲MySQL即可
if target_db_type.upper()=='ORACLE':
  conn=cx_Oracle.connect('scott/[email protected]/orcl')                  #改成你自己的連接串
  cur =conn.cursor()
  cur.execute("alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'") #在導入數據庫之前,先檢查一下Date類型數據格式
elif target_db_type.upper()=='MYSQL':
  conn=pymysql.connect("192.168.56.101","scott","tiger","db")              #改成你自己的連接串
  cur = conn.cursor()
cur.arraysize = 1000
target_table=input("請輸入要導入的表名:")
ifreadheader=input("是否包含表頭(y,n):")                                     #CSV文件是否包含表頭
if ifreadheader=='y':
 headervalue=0
elif ifreadheader=='n':
 headervalue=None
cur.execute('select * from '+target_table+' where 1=0')                    #獲取列信息
val_str = ''
if target_db_type.upper()=='MYSQL':
 for i in range (1,len(cur.description)):
  val_str=val_str+'%s'+','
 val_str=val_str+'%s'                                                      #MySQL批量插入語法是 insert into tb_name values(%s,%s,%s,%s)
elif target_db_type.upper()=='ORACLE':
 for i in range (1,len(cur.description)):
  val_str=val_str+':'+str(i)+','
 val_str=val_str+':'+str(i+1)                                              #Oracle批量插入語法是 insert into tb_name values(:1,:2,:3)
insert_sql='insert into '+target_table+' values('+val_str+')'              #拼接insert into 目標表 values
print('開始導入:',time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
csv_data=pandas.read_csv('csvfile.txt',header=headervalue,chunksize=50000,encoding='GBK',na_filter='') #na_filter='' 將空值處理爲'' 不然默認爲NaN
for chunk in csv_data:
 rows=chunk.values.tolist()
 for x in range(0,len(rows)):                                              #將rows中的''處理爲None,不然沙雕MySQL INT類型字段值''會變成0 VARCHAR字段值會變成'' 而不是NULL
    for i in range(0,len(rows[x])):
       if rows[x][i]=='':
        rows[x][i]=None
 cur.executemany(insert_sql,rows)                                          #批量插入
 conn.commit()
cur.close()
conn.close()
print('導入完成:',time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

想不想成爲SQL大神?想不想精通SQL優化,精通所有關係型數據庫優化?
加我微信692162374 報名單獨輔導 , 順帶我還可以教你Python,Oracle,MySQL,大數據,以及數據倉庫建模

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章