您的位置:首页 > 编程语言 > Python开发

使用python 将csv文件导入mysql

2019-06-10 16:41 1681 查看

Ocacle方面,PLSQL可以利用自带的导入功能将txt格式文件导入表,但需要预先创建表结构。PLSQL导入功能还有一个好处是可以自动对齐字段,缺失的字段可以自动忽略,不会报错停止。

SQL server 自带的导入工具功能十分强大,可以使用导入平面工具直接将csv或者txt文件导入至数据库中,并且可以自动创建表和表结构。

而mysql方面,自带的工具是LOAD DATA 和 mysqlimport ,这两个工具的优势是能够快速的将大量数据导入至数据库中,同时需要预先创建好表结构。

如果我们想利用python将csv文件导入至数据库中并且自动创建表结构,该怎么办呢?接下来我们利用pymysql和pandas完成这项任务。
实际上,本方法同样适用于导入其他数据库(例如Oracle、MongoDB等),只需要调用不同的python-数据库接口

首先建立和数据库的连接

import pymysql
# 参数设置 DictCursor使输出为字典模式 连接到本地用户root 密码为666
config = dict(host='localhost', user='root', password='666',
cursorclass=pymysql.cursors.DictCursor
)
# 建立连接
conn = pymysql.Connect(**config)
# 自动确认commit True
conn.autocommit(1)# 设置光标
cursor = conn.cursor()

其次,利用pandas读取目标文件

这里为了示范,随便从网上下载了一个数据包:
http://quotes.money.163.com/trade/lsjysj_600508.html#01b07

import pandas as pd
# pandas读取文件 这里随便找了一个爬取的股票文件改的名字
# usecols 就是说我只用这些列其他列不需要
# parse_dates 由于csv只储存str、int、float格式无法储存日期格式,所以读取是设定吧日期列读作时间格式
path = 'C:\\Users\\XXX\\Desktop\\XXX\\600508.csv'
df = pd.read_csv(path, encoding='gbk', usecols=[0, 3, 4, 5, 6, 11], parse_dates=['日期'] )

写一个函数,用来解析csv文件转化为的dataframe,并返回相应的建表语句

# 一个根据pandas自动识别type来设定table的type
def make_table_sql(df):
#将df中的列名放入list中
columns = df.columns.tolist()
#判断dataframe中每一列的type
types = df.ftypes
# 添加id 制动递增主键模式
make_table = []
for item in columns:
if 'int' in types[item]:
char = item + ' INT'
elif 'float' in types[item]:
char = item + ' FLOAT'
elif 'object' in types[item]:
char = item + ' VARCHAR(255)'
elif 'datetime' in types[item]:
char = item + ' DATETIME'
make_table.append(char)
#','.join(list)返回的是一个文本串,用','分割了每一个元素然后返回
return ','.join(make_table)

创建函数,用于将解析好的数据内容导入到数据库中

# csv 格式输入 mysql 中
def csv2mysql(db_name, table_name, df):
# 创建database,运行不知道为什么会报错
# cursor.execute('CREATE DATABASE IF NOT EXISTS {}'.format(db_name))
# 选择连接database
conn.select_db(db_name)
#创建table
cursor.execute('DROP TABLE IF EXISTS {}'.format(table_name))
cursor.execute('CREATE TABLE {}({})'.format(table_name,make_table_sql(df)))
# 提取数据转list 这里有与pandas时间模式无法写入因此换成str 此时mysql上格式已经设置完成
df['日期'] = df['日期'].astype('str')
#将数据放入list中
values = df.values.tolist()
# 根据columns个数
s = ','.join(['%s' for _ in range(len(df.columns))])
# executemany批量操作 插入数据 批量操作比逐个操作速度快很多
cursor.executemany('INSERT INTO {} VALUES ({})'.format(table_name,s), values)

运行function

csv2mysql(db_name='testdb', table_name='test',df = df)

测试一下是否写入成功

cursor.execute('SELECT * FROM test1 LIMIT 5')
# scroll(self, value, mode='relative') 移动指针到某一行; 如果mode='relative',则表示从当前所在行移动value条,如果 mode='absolute',则表示从结果集的第一行移动value条.
cursor.scroll(4)
cursor.fetchall()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: