Python批量将csv格式文件导入Mysql数据库

前言:
前面分享的几篇文章当中已经实现从tushare获取数据文件本地储存化,这段时间我一直在考虑着如何实现csv文件mysql化,(当你是从我前面文章当中看过来的请再回《Python tushare股票大数据分析与报告生成(优化版2)》去看看,我修改添加了转换trade_date的数据类型那一句代码,因为经过这几天mysql学习发现这一个小问题),于是在网上找相关的代码资料,发现好多都不能直接复制粘贴使用了,于是将其复制并修改了下拿出来跟大家分享下,首先我还是要在这感谢原作者的文章代码,因为是你的无偿分享我才会懂得更多,如果您觉得我侵权了请联系我,我会删除源代码,不多说废话了,下面就是我修改后的代码:

import pymysql
import os
import pandas as pd

#pd.set_option()就是pycharm输出控制显示的设置
pd.set_option('expand_frame_repr', False)#True就是可以换行显示。设置成False的时候不允许换行
pd.set_option('display.max_columns', None)# 显示所有列
#pd.set_option('display.max_rows', None)# 显示所有行
pd.set_option('colheader_justify', 'centre')# 显示居中

try:
    conn = pymysql.connect(host='localhost', user='root', password='你自己数据库的密码', db='你自己数据库的名称', charset='utf8')
    cur = conn.cursor()
    print('数据库连接成功!')
    print(' ')
except:
    print('数据库连接失败!')

os.chdir('D:/stock_data/')  #将路径设置成你csv文件放的地方
path = os.getcwd()
files = os.listdir(path)

i = 0  #计数器,后面可以用来统计一共导入了多少个文件
for file in files:
    if file.split('.')[-1] in ['csv']:  #判断文件是不是csv文件,file.split('.')[-1]获取‘.’后的字符串
        i += 1
        filename = file.split('.')[0]  #获取剔除后缀的名称
        filename = 'data_' + filename
        f = pd.read_csv(file, encoding='gbk')  #用pandas读取文件,得到pandas框架格式的数据
        columns = f.columns.tolist()  #获取表格数据内的列标题文字数据

        types = f.dtypes  #获取文件内数据格式
        field = []  #设置列表用来接收文件转换后的数据,为写入mysql做准备
        table = []
        char = []
        for item in range(len(columns)):  #开始循环获取文件格式类型并将其转换成mysql文件格式类型
            if 'object' == str(types[item]):
                char = '`' + columns[item] + '`' + ' VARCHAR(255)'  #必须加上`这个点,否则在写入mysql是会报错
            elif 'int64' == str(types[item]):
                char = '`' + columns[item] + '`' + ' INT'
            elif 'float64' == str(types[item]):
                char = '`' + columns[item] + '`' + ' FLOAT'
            elif 'datetime64[ns]' == str(types[item]):
                char = '`' + columns[item] + '`' + ' DATETIME'
            else:
                char = '`' + columns[item] + '`' + ' VARCHAR(255)'
            table.append(char)
            field.append('`' + columns[item] + '`')

        tables = ','.join(table)  #将table中的元素用,连接起来为后面写入mysql做准备
        fields = ','.join(field)

        cur.execute('drop table if exists {};'.format(filename))
        conn.commit()

        #创建表格并设置表格的列文字跟累数据格式类型
        table_sql = 'CREATE TABLE IF NOT EXISTS ' + filename + '(' + 'id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,' + tables + ');'
        print('表:' + filename + ',开始创建数据表...')
        cur.execute(table_sql)
        conn.commit()
        print('表:' + filename + ',创建成功!')

        print('表:' + filename + ',正在写入数据当中...')
        f_sql = f.astype(object).where(pd.notnull(f), None)  #将原来从csv文件获取得到的空值数据设置成None,不设置将会报错
        values = f_sql.values.tolist()  #获取数值
        s = ','.join(['%s' for _ in range(len(f.columns))])  #获得文件数据有多少列,每个列用一个 %s 替代
        insert_sql = 'insert into {}({}) values({})'.format(filename,fields,s)
        cur.executemany(insert_sql, values)
        conn.commit()
        print('表:' + filename + ',数据写入完成!')
        print(' ')
cur.close()
conn.close()
print('文件导入数据库完成!一共导入了 {} 个CSV文件。'.format(i))

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Wilburzzz/article/details/106943545