Импортируйте несколько файлов CSV в MySQL с помощью Python - PullRequest
1 голос
/ 26 ноября 2009

Я пытаюсь использовать примеры, которые мне интересны / интересны для изучения MySQL и Python. Я новичок в обоих, так как я по профессии финансист. Я многому научился на этом пути, но сейчас я не уверен, куда идти.

Файлы данных, которые я хочу импортировать, содержатся в zip-файле, размещенном: здесь

Я распаковал каталог, там более 1000 файлов. В приведенном ниже коде я просто пытаюсь ссылаться на один из файлов по отдельности, чтобы разобрать его в MySQL.

Я полностью осознаю, что должен быть более простой способ сделать это, но я учусь, и я уверен, что мой код отражает это (вы можете видеть, что я напечатал некоторые основные печатные издания, чтобы увидеть, что мой код был правильно).

Буду признателен за любую помощь, которую вы сможете оказать. По сути, когда дело доходит до Python, я рассматриваю это как хобби и способ получить большой объем данных в Интернете, с которыми я хочу играть. Я вставил свой код ниже, чтобы вы могли видеть, откуда я.

  • Брок

P.S. Извините за код ниже, не могу найти лучший способ опубликовать его.

Код ниже - мой скрипт создания таблицы

> 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 ]

5 голосов
/ 26 ноября 2009

Почему бы не использовать собственную функцию импорта CSV в MySQL?

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';
1 голос
/ 26 ноября 2009

Вы хотите вывести фактическую ошибку, например:

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)")

Обратите внимание, что вы хотите указать ключевое слово LOCAL для LOAD DATA. Без этого он будет предполагать, что файл находится на компьютере, на котором работает ваш сервер MySQL, который может отличаться от того, на котором работает ваш скрипт?

0 голосов
/ 13 февраля 2013

Полагаю, у вас ошибка, похожая на ту, что была у меня.

попробуй

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';

Этот синтаксис должен гарантировать, что данные читаются относительно клиента, а не сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...