把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()
最后记得要去数据库上面查看是否有这个数据表,是否有这些数据。