使用Python将多个CSV文件导入MySQL

1 投票
3 回答
6794 浏览
提问于 2025-04-15 16:23

我正在尝试用一些我觉得有趣的例子来学习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';

撰写回答