1. 程式人生 > 其它 >如何通過Python將CSV檔案匯入MySQL資料庫?

如何通過Python將CSV檔案匯入MySQL資料庫?

技術標籤:資料庫mysqlpythoncsvjdbc

CSV檔案匯入資料庫一般有兩種方法:

1、通過SQL的insert方法一條一條匯入,適合資料量小的CSV檔案,這裡不做贅述。

2、通過load data方法匯入,速度快,適合大資料檔案,也是本文的重點。

樣本CSV檔案如下:

總體工作分為3步:

1、用python連線mysql資料庫,可參考如何使用python連線資料庫?

2、基於CSV檔案表格欄位建立表

3、使用load data方法匯入CSV檔案內容

load data語法簡介:

LOAD DATA LOCAL INFILE 'csv_file_path' INTO TABLE table_name FIELDS TERMINATED BY ',' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES

csv_file_path 指檔案絕對路徑

table_name 指表名稱

FIELDS TERMINATED BY ',' 指以逗號分隔

LINES TERMINATED BY '\\r\\n' 指換行

IGNORE 1 LINES 指跳過第一行,因為第一行是表的欄位名


下面給出全部程式碼:

下面給出全部程式碼:
#匯入pymysql方法
import pymysql


#連線資料庫
config = {'host':'',
          'port':3306,
          'user':'evdata',
          'passwd':'',
          'charset':'utf8mb4',
          'local_infile':1
          }
conn = pymysql.connect(**config)
cur = conn.cursor()


#load_csv函式,引數分別為csv檔案路徑,表名稱,資料庫名稱
def load_csv(csv_file_path,table_name,database='evdata'):
    #開啟csv檔案
    file = open(csv_file_path, 'r',encoding='utf-8')
    #讀取csv檔案第一行欄位名,建立表
    reader = file.readline()
    b = reader.split(',')
    colum = ''
    for a in b:
        colum = colum + a + ' varchar(255),'
    colum = colum[:-1]
    #編寫sql,create_sql負責建立表,data_sql負責匯入資料
    create_sql = 'create table if not exists ' + table_name + ' ' + '(' + colum + ')' + ' DEFAULT CHARSET=utf8'
    data_sql = "LOAD DATA LOCAL INFILE '%s' INTO TABLE %s FIELDS TERMINATED BY ',' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES" % (csv_filename,table_name)
 
    #使用資料庫
    cur.execute('use %s' % database)
    #設定編碼格式
    cur.execute('SET NAMES utf8;')
    cur.execute('SET character_set_connection=utf8;')
    #執行create_sql,建立表
    cur.execute(create_sql)
    #執行data_sql,匯入資料
    cur.execute(data_sql)
    conn.commit()
    #關閉連線
    conn.close()
    cur.close()

出現的問題:

我是用win10系統,程式碼執行時會出現以下錯誤

ERROR 1148 (42000): The used command is not allowed with this MySQL version.

原因是不支援命令 load data

解決方法:

需要更改下配置檔案

在mysql安裝目錄中找到my.ini配置檔案,複製以下內容到檔案中

[mysqld]        #服務端配置
local-infle = 1
 
[mysql]         #客戶端配置
local-infile = 1