Python将一组.csv文件加载到MySQL中

时间:2014-01-01 12:54:36

标签: python mysql sql database csv

我正在使用以下命令将多个.csv文件加载到Mysql数据库中,但我没有收到任何错误(IDLE窗口)并且数据未加载

这是错误的脚本

#!C:\Python27\python.exe

import MySQLdb
import os
import string

# Open database connection
db = MySQLdb.connect (host="localhost",port=3307,user="root",\
                      passwd="gamma123",db="test")

cursor=db.cursor()


l = os.listdir(".")
for file_name in l:
        print file_name
        cursor=db.cursor()
        if (file_name.find("DIV.csv")>-1):
           #Query under testing
            sql = """LOAD DATA LOCAL INFILE file_name \
            INTO TABLE system_work \
            FIELDS TERMINATED BY ',' \
            OPTIONALLY ENCLOSED BY '"'  \
            LINES TERMINATED BY '\r\n' \
            IGNORE 1 LINES;;"""
try:
            # Execute the SQL command
            cursor.execute(sql)
            # Commit your changes in the database
            db.commit()
except:
            # Rollback in case there is any error
            db.rollback()

# disconnect from server
db.close()

但是当我尝试使用以下python脚本加载单个文件时,它的工作正常。 请帮帮....

#!C:\Python27\python.exe

import MySQLdb
import os
import string

# Open database connection
db = MySQLdb.connect (host="localhost",port=3307,user="root",\
                      passwd="gamma123",db="test")

cursor=db.cursor()

#Query under testing
sql = """LOAD DATA LOCAL INFILE 'Axle.csv' \
      INTO TABLE system_work \
      FIELDS TERMINATED BY ',' \
      OPTIONALLY ENCLOSED BY '"'  \
      LINES TERMINATED BY '\r\n' \
      IGNORE 1 LINES;;"""

try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

2 个答案:

答案 0 :(得分:6)

您需要将文件名插入到SQL字符串中;您只是将文字文​​本file_name发送到服务器。您可以使用str.format()方法,然后可以使用您选择的变量替换任何{}占位符。

必须缩进tryexcept块,使其位于for循环中:

sql = """LOAD DATA LOCAL INFILE '{}'
INTO TABLE system_work
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\\r\\n'
IGNORE 1 LINES;;"""

for file_name in l:
    print file_name
    if file_name.endswith('DIV.csv'):
        try:
            cursor = db.cursor()
            cursor.execute(sql.format(file_name))
            db.commit()
        except Exception:
            # Rollback in case there is any error
            db.rollback()

cursor.execute()方法传递sql字符串并插入file_name变量。在将SQL语句传递给MySQL之前,第一行({})上的LOAD DATA LOCAL INFILE '{}'部分将被file_name中的值替换。

我还简化了文件名测试;假设文件名DIV.csv结束就足够了。

请注意,使用mysqlimport utility可能更容易;你可以用以下方法获得完全相同的结果:

mysqlimport --fields-terminated-by=, --fields-optionally-enclosed-by=\" \
            --local --lines-terminated-by=\r\n --user=root --password=gamma123 \
            test *DIV.csv

答案 1 :(得分:1)

if (file_name.find("DIV.csv")>-1):除非你的所有文件都被实际调用,否则DIV.csv应该是if (file_name.find(".csv")>-1):(这可能会更有效地测试文件名的最后四个字母)