我很感兴趣,如果有一个简单的方法来导入mysqldump到Pandas。
我有几个小(~ 110 MB)表,我想有他们作为数据框。
我希望避免把数据放回数据库,因为这将需要安装/连接到这样的数据库。我有。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 */;
5条答案
按热度按时间wi3ka0sx1#
没有
Pandas没有“原生”的方式来阅读mysqldump而不通过数据库。
有一个可能的变通办法,但在我看来这是一个非常糟糕的主意。
变通方案(不建议用于生产)
当然,您可以使用预处理器解析mysqldump文件中的数据。
MySQLdump文件通常包含大量我们在加载Pandas Dataframe 时不感兴趣的额外数据,因此我们需要对其进行预处理,去除噪声,甚至重新格式化行以使其符合要求。
使用
StringIO
,我们可以读取文件,处理数据,然后再将其馈送到thepandas.read_csv
funcion现在我们有了一个读取数据并将其格式化为CSV文件的函数,可以使用
pandas.read_csv()
读取它结果:
以及
关于流处理的说明
这种方法被称为流处理,令人难以置信地精简,几乎完全不占用内存。总的来说,使用这种方法将csv文件更高效地读入Pandas是个好主意。
我建议不要解析mysqldump文件
xmq68pz92#
一种方法是export mysqldump to sqlite(例如run this shell script),然后读取sqlite文件/数据库。
请参见文档的SQL部分:
read_sql
... *b4wnujal3#
I found myself in a similar situation to yours, and the answer from @ firelynx was really helpful!
But since I had only limited knowledge of the tables included in the file, I extended the script by adding the header generation (pandas picks it up automatically), as well as searching for all the tables within the dump file. As a result, I ended up with a following script, that indeed works extremely fast. I switched to
io.StringIO
, and save the resulting tables astable_name.csv
files.P.S. I also support the advise against relying on this approach, and provide the code just for illustration purposes :)
So, first thing first, we can augment the
read_dump
function like thisTo find the list of tables we can use the following function:
Then just combine the two, for example in a .py script that you'll run like
python this_script.py mysqldump_name.sql [table_name]
k3bvogb14#
我想分享我对这个问题的解决方案,并征求反馈:
当然,记录器部分可以移除......
pgpifvop5#
我在一台没有数据库连接的本地计算机上工作。我工作的正常流程是给一个.tsv
尝试mysqltotsv pypi模块:
这将在
out1
目录中生成多个.tsv
文件(MySQL转储中的每个表对应一个.tsv
文件),然后通过加载TSV文件继续Pandas的正常工作流程。