讀取csv文件寫入mysql數據庫

把csv文件的數據讀取,然後在寫入mysql數據庫的數據表中

導入模塊

import pymysql
import pandas as pd

這裏用到兩個模塊

打開數據庫

class Mysql_csv(object):
    #定義一個init方法,用於讀取數據庫
    def __init__(self):
        #讀取數據庫和建立遊標對象
        self.connect = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="數據庫密碼",database="python-04",charset="utf8")
        self.cursor = self.connect.cursor()

我是使用面向對象的風格來編寫代碼的,所以首先要先建立一個類,首先我們先開啓數據庫,然後在用cursor建立一個遊標對象,遊標對象是用於後面的對數據的增、刪、改、查的。
在使用數據庫前,要先下載mysql服務器,然後要建立數據庫才能使用數據庫,這個可以上網上百度。
host傳遞的對象是你服務器的ip,也可以填localhost。
port是傳遞端口號,一般都是3306。
user傳遞的是用戶,如果你的服務器在你的電腦上,一般都是root。
password傳遞的是你的數據庫密碼,這行代碼我沒有填上我的數據密碼。
databases傳遞的是你要使用哪個數據庫。
charset是編碼格式,一般都是用utf8,記得不要填utf-8。

讀取csv文件的列索引

 def read_csv_colnmus(self):
        data = pd.read_csv("I:/crack/DATA/myfir.csv",encoding="utf-8")
        data_1 = list(data.columns)
        return data_1

這裏要把csv文件數據的列索引讀取出來,然後在建立數據表的時候作爲字段,因爲讀取出來的列索引是一個array一維數組,所以轉化爲列表更容易操作。
這裏使用的是一個電影數據,分享如下:
鏈接:https://pan.baidu.com/s/1eaXItRwKFLOld_ssuW1eBQ
提取碼:sagv

讀取csv文件數據

    def read_csv_values(self):
        #讀取csv文件數據
        data = pd.read_csv("I:/crack/DATA/myfir.csv", encoding="utf-8")
        data_3 = list(data.values)
        return data_3

因爲讀取的數據是DataFrame二維數據,所以把他轉化爲列表更方便操作。

確認事務進行

 def commit(self):
        #定義一個確認事務運行
        self.connect.commit()

定義一個確認事務進行的方法,數據表中每次寫完數據都要調用一次事務確認,否則就沒有寫入數據

創建數據表

data_2 = self.read_csv_colnmus()
        sql = """create table movie({0} int unsigned primary key not null auto_increment,{1} varchar(200),{2} varchar(100),{3} varchar(100),{4} varchar(100),{5} int)""".format(data_2[0],data_2[1],data_2[2],data_2[3],data_2[4],data_2[5])
        self.cursor.execute(sql)
        self.commit()

sql對象的內容就是sql語句中創建數據表的語句,然後用execute來執行這個語句。
csv文件中有時間的類型,但是個別的時間類型後面有國家的標註,如果創建數據表時想要把這一列的數據類型定義爲date是不行的,因爲時間後面還有國家的標註,如果想要把這一列的數據強制定義爲時間類型的數據,也可以用pandas中的時間序列來把他強制轉化爲時間,但是有點麻煩,我就直接把他定義爲varchar數據類型。

寫入數據

    def write_mysql(self):
        #在數據表中寫入數據,因爲數據是列表類型,把他轉化爲元組更符合sql語句
        for i in self.read_csv_values(): #因爲數據是迭代列表,所以用循環把數據提取出來
            data_6 = tuple(i)
            sql = """insert into movie values{}""".format(data_6)
            self.cursor.execute(sql)
            self.commit()
        print("植入完成")

因爲剛纔讀取的數據是列表中嵌入了列表,然後就要把他用for循環提取出來,在轉化爲元組類型。
sql對象的內容也是sql語句中的插入數據的語句。

關閉數據庫和遊標對象

    def __del__(self):
        self.connect.close()
        self.cursor.close()

這裏使用一個del方法,在整個程序運行完了之後再調用這個方法,來關閉數據庫和遊標

運行程序

    def run(self):
        self.create()
        self.write_mysql()

定義一個run方法來運行整個程序,記得一定要先調用建立數據表的方法,然後在運行寫入數據的方法

封裝

def main():
    sql = Mysql_csv()
    sql.run()
if __name__ == '__main__':
    main()

源代碼

import pymysql
import pandas as pd
#用面向對象的方式編寫,更加熟悉面向對象代碼風格
class Mysql_csv(object):
    #定義一個init方法,用於讀取數據庫
    def __init__(self):
        #讀取數據庫和建立遊標對象
        self.connect = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="1505294687",database="python-04",charset="utf8")
        self.cursor = self.connect.cursor()
    #定義一個del類,用於運行完所有程序的時候關閉數據庫和遊標對象
    def __del__(self):
        self.connect.close()
        self.cursor.close()
    def read_csv_colnmus(self):
        #讀取csv文件的列索引,用於建立數據表時的字段
        data = pd.read_csv("I:/crack/DATA/myfir.csv",encoding="utf-8")
        #因爲讀取的數據類型是array一維數組,所以把他轉化成列表更方便操作
        data_1 = list(data.columns)
        return data_1
    def read_csv_values(self):
        #讀取csv文件數據
        data = pd.read_csv("I:/crack/DATA/myfir.csv", encoding="utf-8")
        data_3 = list(data.values)
        return data_3
    def write_mysql(self):
        #在數據表中寫入數據,因爲數據是列表類型,把他轉化爲元組更符合sql語句
        for i in self.read_csv_values(): #因爲數據是迭代列表,所以用循環把數據提取出來
            data_6 = tuple(i)
            sql = """insert into movie values{}""".format(data_6)
            self.cursor.execute(sql)
            self.commit()
        print("植入完成")
    def commit(self):
        #定義一個確認事務運行
        self.connect.commit()
    def create(self):
        #創建數據表,用剛纔提取的列索引作爲字段
        data_2 = self.read_csv_colnmus()
        sql = """create table movie({0} int unsigned primary key not null auto_increment,{1} varchar(200),{2} varchar(100),{3} varchar(100),{4} varchar(100),{5} int)""".format(data_2[0],data_2[1],data_2[2],data_2[3],data_2[4],data_2[5])
        self.cursor.execute(sql)
        self.commit()
    #運行程序,記得要先調用創建數據的類,在創建寫入數據的類
    def run(self):
        self.create()
        self.write_mysql()
#最後用一個main()函數來封裝
def main():
    sql = Mysql_csv()
    sql.run()
if __name__ == '__main__':
    main()

最後記得要去數據庫上面查看是否有這個數據表,是否有這些數據。
在這裏插入圖片描述

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