使用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()
相关文章推荐
- 使用python读取csv文件,并将数据更新至mysql
- mysql使用load导入csv文件所遇到的问题及解决方法
- 使用Navicat for MySql导入.CSV文件
- Python使用pandas & pymysql读取MySQL数据到csv文件中
- 使用Python将csv文件批量化导入SQL Server
- mysql导入csv文件,与python连接
- 使用navicat将csv文件导入mysql
- MySQL 使用 LOAD DATA 导入 csv 文件
- 使用Navicat for MySql导入.CSV文件
- 如何把.csv文件导入到mysql中以及如何使用mysql 脚本中的load data快速导入
- MySQL 使用 LOAD DATA 导入 csv 文件
- 使用navicat将csv文件导入mysql
- 使用pandas导入csv文件到MySQL
- 关于MySQL中使用LOAD DATA INFILE导入csv文件时的日期格式问题
- 使用ODBC, 将CSV文件里的数据导入DataSet
- 使用PHP导入和导出CSV文件
- Python_使用csv模块解析csv文件
- php根据二分查找法从普通csv文件中获取ip的地理位置(效率比使用mysql提高近800倍)
- php操作csv文件导入mysql时中文乱码的解决办法
- 通过java导入csv文件到oracle(mysql)数据库