2009-11-25 25 views
1

我正在嘗試使用有趣/有趣的示例來學習MySQL和Python。我對這兩個人都是新手,因爲我是一個貿易融資人。我已經學到了很多東西,但我正處在一個不確定要去哪裏的地步。使用Python將多個CSV文件導入MySQL

的數據文件,我期待導入包含在一個zip文件,主辦:here

我解壓的目錄,是有超過1000個文件。在下面的代碼中,我只是單獨引用其中一個文件來解析它到MySQL中。

我完全意識到必須有更簡單的方法來解決這個問題,但我正在學習,並且我確信我的代碼反映了它(您可以看到我鍵入了一些基本打印以查看我的代碼是正確的)。

您可以提供的任何幫助將非常感謝。從本質上講,當涉及到Python時,我把它看作是一種愛好,也是一種獲取我想要玩的網絡上大量數據的方式。我在下面粘貼了我的代碼,以便您可以看到我來自哪裏。

  • 布洛克

附:對於下面的代碼抱歉,找不到更好的發佈方式。下面

的代碼是我創建表腳本

> 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的模式中。我設置了我的表,因此,我相信,爲輸入到db的每個記錄都會創建一個序列號。我將它作爲一個字符串傳遞給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() 
+0

有一個技巧來格式化您的代碼。技巧寫在頁面的右側。請閱讀。請。 –

回答

5

爲什麼不使用MySQLs自己的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'; 
+0

也許是因爲我仍在學習Python,但我正在向原始csv添加一列。我希望能夠識別每個文件,所以我試圖將其名稱添加爲數據庫中的一列。 – Btibert3

+0

我修改了我的表與csv完全匹配,並試圖在上面讀取它,但它不讀取數據。我不得不錯過一些非常明顯的事情。再次感謝。 – Btibert3

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服務器的機器上,可能與運行腳本的機器不同。

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

這句法是爲了確保數據被讀取相對於客戶端而不是服務器。