Kei*_*ith 6 python mysql mysqldump pandas pandas-datareader
我感兴趣的是有一种简单的方法可以将mysqldump导入Pandas.
我有一些小的(~110MB)表,我想将它们作为DataFrames.
我想避免将数据放回数据库,因为这需要安装/连接到这样的数据库.我有.sql文件,并希望将包含的表导入Pandas.是否有任何模块可以执行此操作?
如果版本控制很重要.sql文件全部列出"MySQL dump 10.13 Distrib 5.6.13,for Win32(x86)"作为生成转储的系统.
我在没有数据库连接的计算机上本地工作.我的工作的正常流程是从第三方获得.tsv,.csv或json,并做一些将被回馈的分析.一个新的第三方以.sql格式提供了所有数据,这打破了我的工作流程,因为我需要大量的开销才能将其转换为我的程序可以作为输入的格式.我们最终要求他们以不同的格式发送数据,但出于业务/声誉的原因,他们希望首先寻找一个解决方案.
编辑:下面是两个表的示例MYSQLDump文件.
/*
MySQL - 5.6.28 : Database - ztest
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`ztest` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `ztest`;
/*Table structure for table `food_in` */
DROP TABLE IF EXISTS `food_in`;
CREATE TABLE `food_in` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Cat` varchar(255) DEFAULT NULL,
`Item` varchar(255) DEFAULT NULL,
`price` decimal(10,4) DEFAULT NULL,
`quantity` decimal(10,0) DEFAULT NULL,
KEY `ID` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
/*Data for the table `food_in` */
insert into `food_in`(`ID`,`Cat`,`Item`,`price`,`quantity`) values
(2,'Liq','Beer','2.5000','300'),
(7,'Liq','Water','3.5000','230'),
(9,'Liq','Soda','3.5000','399');
/*Table structure for table `food_min` */
DROP TABLE IF EXISTS `food_min`;
CREATE TABLE `food_min` (
`Item` varchar(255) DEFAULT NULL,
`quantity` decimal(10,0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*Data for the table `food_min` */
insert into `food_min`(`Item`,`quantity`) values
('Pizza','300'),
('Hotdogs','200'),
('Beer','300'),
('Water','230'),
('Soda','399'),
('Soup','100');
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
Run Code Online (Sandbox Code Playgroud)
fir*_*ynx 15
Pandas没有本地方式读取mysqldump而没有通过数据库.
有一种可能的解决方法,但在我看来这是一个非常糟糕的主意.
当然,您可以使用预处理器解析mysqldump文件中的数据.
MySQLdump文件通常包含许多我们在加载pandas数据帧时不感兴趣的额外数据,因此我们需要预处理它并去除噪声甚至重新格式化行以使它们符合.
使用StringIO我们可以读文件,处理数据,它被送到之前的pandas.read_csvfuncion
from StringIO import StringIO
import re
def read_dump(dump_filename, target_table):
sio = StringIO()
fast_forward = True
with open(dump_filename, 'rb') as f:
for line in f:
line = line.strip()
if line.lower().startswith('insert') and target_table in line:
fast_forward = False
if fast_forward:
continue
data = re.findall('\([^\)]*\)', line)
try:
newline = data[0]
newline = newline.strip(' ()')
newline = newline.replace('`', '')
sio.write(newline)
sio.write("\n")
except IndexError:
pass
if line.endswith(';'):
break
sio.pos = 0
return sio
Run Code Online (Sandbox Code Playgroud)
现在我们有一个函数可以读取数据并将其格式化为CSV文件,我们可以用它来读取它 pandas.read_csv()
import pandas as pd
food_min_filedata = read_dump('mysqldumpexample', 'food_min')
food_in_filedata = read_dump('mysqldumpexample', 'food_in')
df_food_min = pd.read_csv(food_min_filedata)
df_food_in = pd.read_csv(food_in_filedata)
Run Code Online (Sandbox Code Playgroud)
结果是:
Item quantity
0 'Pizza' '300'
1 'Hotdogs' '200'
2 'Beer' '300'
3 'Water' '230'
4 'Soda' '399'
5 'Soup' '100'
Run Code Online (Sandbox Code Playgroud)
和
ID Cat Item price quantity
0 2 'Liq' 'Beer' '2.5000' '300'
1 7 'Liq' 'Water' '3.5000' '230'
2 9 'Liq' 'Soda' '3.5000' '399'
Run Code Online (Sandbox Code Playgroud)
这种方法称为流处理,非常精简,几乎不占用任何内存.通常,使用此方法更有效地将csv文件读入pandas是一个好主意.
它是我建议反对的mysqldump文件的解析
| 归档时间: |
|
| 查看次数: |
6563 次 |
| 最近记录: |