读取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()

最后记得要去数据库上面查看是否有这个数据表,是否有这些数据。
在这里插入图片描述

发布了28 篇原创文章 · 获赞 14 · 访问量 6786

猜你喜欢

转载自blog.csdn.net/weixin_42304193/article/details/89608169
今日推荐