Python 利用Pandas把數據直接導入Mysql


前言

本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯系我們以作處理。

PS:如有需要Python學習資料的小伙伴可以點擊下方鏈接自行獲取

Python免費學習資料、代碼以及交流解答點擊即可加入


 

需要把txt文件數據導入mysql數據庫,中間需要經過一些數據處理,在經過相關查找后,pandas自帶的to_sql(),可以實現把DataFrame直接導入數據庫。

雖然mysql有其他的方式導入數據,但是在導入前需要對數據進行一些處理,這些任務無法完成,所以可以借助python來一步實現所有需求。

pandas在處理表格數據有很多優點:API多比較方便、速度快;可循環每行,對每個值進行處理;也可對整列進行處理等

在導入數據庫時用的是如下API:
Pandas.DataFrame.to_sql()

參數介紹及注意事項

官方文檔:[https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html]

DataFrame.to_sql(name, con, schema=None, if_exists='fail', index=True, index_label=None, chunksize=None, dtype=None, method=None)
常用參數:

  • name:
    導入到mysql時表的名字
    如果mysql里面已經用CREATE TABLE創建好了表,那么就是該表名字
    如果mysql沒有創建好表,那么可以自己起一個合適的表名
  • con:
    數據庫連接,需要安裝sqlalchemy庫,目前僅支持sqlalchemy庫創建的連接,pymysql庫創建的連接不支持
engine = create_engine("mysql+pymysql://root:z123456@127.0.0.1:3306/routeapp?charset=utf8") 2#SQLALCHEMY_DATABASE_URI = '%s+%s://%s:%s@%s:%s/%s' % (DB_TYPE, DB_DRIVER, DB_USER,DB_PASS, DB_HOST, DB_PORT, DB_NAME) 
  • if_exists:以下三個選項,是如果數據庫里面已經存在該表的意思
    "fail":直接報錯,不再操作,類似mysql創建表時的IF NOT EXISTS才創建表
    "replace":先刪除該表,然后再創建
    "append":直接在表后面添加數據
  • index:bool
    是否把DataFrame的索引列寫入表中
  • index_label:
    如果要把DataFrame的索引列寫入表中,那么需要給出該索引列的名字,如果沒給的話,那就會用DataFrame的列索引名
    注意事項:
    con 參數一定要仔細核對,否則數據庫會連接失敗,可參照上面給出的例子按自己的實際數據庫位置進行更改

案例

首先電腦上已安裝:mysql軟件、sqlalchemy庫、pandas庫

現在有一些城市之間的火車車次信息,需要導入數據庫

import pandas as pd data=pd.read_table('./data_pandas.txt') data.head() 

 

假如數據庫里面已經創建好該表,並且已經指定好各列的數據類型,現在只需把數據導入到里面

CREATE TABLE IF NOT EXISTS train ( start_city VARCHAR (100) NOT NULL COMMENT '始發城市', start_city_id int COMMENT '始發城市id', end_city VARCHAR (100) NOT NULL COMMENT '到達城市', end_city_id int COMMENT '到達城市id', train_code VARCHAR (20) NOT NULL COMMENT '車次', arrival_time VARCHAR (20) NOT NULL COMMENT '到達時間', departure_time VARCHAR (20) NOT NULL COMMENT '出發時間', run_time INT NOT NULL COMMENT '運行時間(分鍾)', P1 FLOAT COMMENT '硬座票價', P2 FLOAT COMMENT '軟座票價', P3 FLOAT COMMENT '硬卧票價', P4 FLOAT COMMENT '軟卧票價', P5 FLOAT COMMENT '商務座票價', P6 FLOAT COMMENT '一等座', P7 FLOAT COMMENT '二等座' ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '城市之間火車信息'; 

借助sqlalchemy庫來導入數據

from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://root:z123456@127.0.0.1:3306/routeapp?charset=utf8") #SQLALCHEMY_DATABASE_URI = '%s+%s://%s:%s@%s:%s/%s' % (DB_TYPE, DB_DRIVER, DB_USER,DB_PASS, DB_HOST, DB_PORT, DB_NAME) with engine.begin() as conn: data.to_sql(name='routeapp_train_line_tb_new_2',con=conn,if_exists='append',index=False) 

這里用with語句可以實現mysql的roallback功能,建議最好用with來導入數據

 

參考文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM