把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()
最後記得要去數據庫上面查看是否有這個數據表,是否有這些數據。