使用Python将多个CSV文件导入MySQL
我正在尝试用一些我觉得有趣的例子来学习MySQL和Python。其实我对这两者都很陌生,因为我本身是做金融的。虽然我在学习的过程中学到了不少东西,但现在我有点不知道该往哪里走了。
我想导入的数据文件被压缩在一个zip文件里,链接在这里:这里
我解压了这个目录,里面有超过1000个文件。在下面的代码中,我只是想单独引用其中一个文件,把它解析到MySQL里。
我知道其实有更简单的方法来处理这些事情,但我正在学习,肯定我的代码也反映了这一点(你可以看到我加了一些基本的打印语句来确认我的代码是否正确)。
如果你能提供任何帮助,我将非常感激。说实话,我把Python当作一种爱好,想用它来处理网上大量我想玩的数据。我把我的代码粘贴在下面,你可以看看我现在的进展。
- Brock
附言:抱歉下面的代码格式不太好,我没找到更好的发布方式。
下面的代码是我的创建表格的脚本
> DROP TABLE IF EXISTS `nba`.`event`;
CREATE TABLE `nba`.`event` (
`a1` varchar(45) DEFAULT NULL,
`a2` varchar(45) DEFAULT NULL,
`a3` varchar(45) DEFAULT NULL,
`a4` varchar(45) DEFAULT NULL,
`a5` varchar(45) DEFAULT NULL,
`h1` varchar(45) DEFAULT NULL,
`h2` varchar(45) DEFAULT NULL,
`h3` varchar(45) DEFAULT NULL,
`h4` varchar(45) DEFAULT NULL,
`h5` varchar(45) DEFAULT NULL,
`period` int(11) DEFAULT NULL,
`time` time DEFAULT NULL,
`team` varchar(3) DEFAULT NULL,
`etype` varchar(15) DEFAULT NULL,
`assist` varchar(45) DEFAULT NULL,
`away` varchar(45) DEFAULT NULL,
`block` varchar(45) DEFAULT NULL,
`entered` varchar(45) DEFAULT NULL,
`home` varchar(45) DEFAULT NULL,
`left` varchar(45) DEFAULT NULL,
`num` int(11) DEFAULT NULL,
`opponent` varchar(45) DEFAULT NULL,
`outof` varchar(45) DEFAULT NULL,
`player` varchar(45) DEFAULT NULL,
`points` int(11) DEFAULT NULL,
`possession` varchar(45) DEFAULT NULL,
`reason` varchar(50) DEFAULT NULL,
`result` varchar(10) DEFAULT NULL,
`steal` varchar(45) DEFAULT NULL,
`type` varchar(30) DEFAULT NULL,
`x` varchar(2) DEFAULT NULL,
`y` varchar(2) DEFAULT NULL,
`gameid` varchar(15) NOT NULL,
`seqnum` int(11) NOT NULL AUTO_INCREMENT,
`updated` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`seqnum`,`gameid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Datafiles of play by play from basketballgeek.com';
这是我的Python脚本。我把上面的表放在一个叫NBA的模式里。我设置了我的表格,我认为每次插入数据库时都会为每条记录生成一个序列号。我把gameid作为字符串传入,同时也假设每次插入语句都会生成时间戳。我知道有个错误,但我不知道是什么。
sql = """LOAD DATA INFILE '%s' INTO TABLE event FIELDS TERMINATED BY ',' LINES TERMINATED BY '\\n';""" % path print sql try: cursor.execute(sql) db.commit() except: print "ERROR" db.rollback() db.close()
3 个回答
0
我想你遇到的错误可能和我之前遇到的类似。
你可以试试
LOAD DATA LOCAL INFILE 'data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
而不是
LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
这个写法是为了确保数据是相对于客户端读取的,而不是服务器。
1
你需要输出实际的错误信息,像这样:
try:
cursor.execute(sql)
db.commit()
except StandardError, e:
print e
db.rollback()
比如,当我执行上面的代码时,我得到以下输出:
(29, "File '/opt/mysql/data/51/test/data.csv' not found (Errcode: 2)")
注意,你在使用LOAD DATA时要加上LOCAL这个关键词。如果不加,它会认为文件是在运行你的MySQL服务器的机器上,而这可能和运行你脚本的机器不是同一台。
5
为什么不直接使用MySQL自带的CSV导入功能呢?
http://dev.mysql.com/doc/refman/5.0/en/load-data.html
LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';