如何将mysqldump导入Pandas

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文件的解析

  • @NikoNyrh 更改 mysql 版本可能会更改转储的布局,这意味着您可能必须重写代码。根据定义,这是一种紧密耦合,并且是一种反模式。 (2认同)
  • @NikoNyrh,我只是不想让人们认为这个答案是一个“好主意”或“不考虑后果就应该做的事情”。我特别不希望有人说“我不应该复制粘贴 firelynx 的代码,他很糟糕”。因为很多人从 StackOverflow 复制粘贴代码,而这里很少有答案提供警告,说明为什么复制粘贴代码可能是一个坏主意。 (2认同)