【问题标题】:import csv file into Mysql Database using python使用python将csv文件导入Mysql数据库
【发布时间】:2013-02-19 03:21:33
【问题描述】:

这是我的代码:

#!/usr/bin/python 
import MySQLdb
import csv

db = MySQLdb.connect(host="host", # The Host
                     user="username", # username
                     passwd="pwd", # password
                     db="databasename") # name of the data base

sqlLoadData = 'LOAD DATA LOCAL INFILE "csv?_file_name.csv" INTO TABLE tablename '   
sqlLoadData += 'FIELDS TERMINATED BY "," LINES TERMINATED BY "\n"'     
sqlLoadData += 'IGNORE 1 LINES'     
sqlLoadData += 'ENCLOSED BY '"' ESCAPED BY "\\" '

try:
    curs = db.cursor()   
    curs.execute(sqlLoadData)    
    resultSet = curs.fetchall()    
except StandardError, e:    
    print e    
    db.rollback()
    db.close()

我收到错误消息:您的 SQL 语法有错误;查看与您的 Mysql 服务器相对应的手册。

当我删除 sqlLoadData += 'ENCLOSED BY '"' ESCAPED BY "\\" ' 部分时,一切正常。我使用最后一部分只是为了从值中删除引号。

我也试过了:

cursor = mydb.cursor()

reader = csv.reader(open('Cumulative.csv', 'rb'))

reader.next() 用于 reader[1:] 中的行: cursor.execute('INSERT INTO Cumulative (C1, C2, C3, C4, C5, C6) VALUES(%s, %s, %s, %s, %s, %s)', 行)
cursor.commit()

关闭与数据库的连接。

cursor.close()

我只想删除引号,以便整数字段支持数据。所以带引号的“1”将被视为字符串而不是整数

谁能帮我理解这个?

谢谢!

【问题讨论】:

    标签: python mysql csv


    【解决方案1】:

    您好像忘记用空格或换行符结束前一行。当解析器试图理解显然不是关键字的LINESENCLOSED 时,这会导致语法错误。

     sqlLoadData += 'IGNORE 1 LINES \n'
     sqlLoadData += ''ENCLOSED BY '"' ESCAPED BY "\" ''
    

    根据经验:当你在调试时,你可以通过删除一行来修复你的代码,不要排除上面的行

    编辑:修改了第二行周围的引号。我认为它打破了“封闭式”声明。

    【讨论】:

    • 修复了 Mysql 查询,但给了我一个错误 Unexpected Character after line continuation character { ' }
    • 进行了更改,立即尝试。 (用一组额外的单引号封装整个字符串)
    • 非常感谢您的快速回放!!还是一样的错误信息。
    • 问题是python认为你过早地终止了你的字符串。错误消息意味着解释器正在读取反斜杠作为“行继续”字符。尝试使用单引号和双引号的不同组合来封装这一行。
    • 非常感谢大卫,我做了一些更改并尝试了一种新方法,但没有成功。
    【解决方案2】:

    经过 2 天的研究,我找到了答案:

    !/usr/bin/python  
    import MySQLdb 
    import csv
    
    db = MySQLdb.connect(host="host", # The Host
                          user="username", # username
                          passwd="pwd", # password
                          db="databasename") # name of the data base
    
     cursor = connection.cursor() 
     Query = """ LOAD DATA LOCAL INFILE 'usrl to csv file' INTO TABLE
     table_nameFIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED
     BY '"' Lines terminated by '\n' IGNORE 1 LINES """
    
    cursor.execute(Query)   
    connection.commit()   
    cursor.close()
    

    希望它会帮助那里的人。

    【讨论】:

    • 如果您能解释一下错误发生的原因以及您是如何解决的,那就太好了。
    • 如果你愿意,我可以解释错误。他解决了错误,将他的所有文本封装在三引号中,而不是单独构建它,这确实好多了。他最初的错误,我也错过了,他只用空格字符结束了他的第一行和第四行,但他的第二行和第三行也需要它们。我认为他的第二行末尾有一个换行符,但实际上它只是在命令“行终止于”命令中包含一个换行符。
    【解决方案3】:

    经过数天和数小时的互联网搜索并遇到各种错误和警告后,这非常有效。我希望这可以节省一些时间

    import MySQLdb
    import os
    import string
    
    db = MySQLdb.connect (host="host",
        user="user",
        passwd="pwd",
        db="database_name",
        local_infile = 1) #Grants permission to write to db from an input file. Without this you get sql Error: (1148, 'The used command is not allowed with this MySQL version')
    
    print "\nConnection to DB established\n"
    
    #The statement 'IGNORE 1 LINES' below makes the Python script ignore first line on csv file
    #You can execute the sql below on the mysql bash to test if it works
    sqlLoadData = """load data local infile 'file.csv' into table table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES;"""
    
    try:
        curs = db.cursor()   
        curs.execute(sqlLoadData)
        db.commit()   
        print "SQL execution complete"   
        resultSet = curs.fetchall()   
    except StandardError, e:    
        print "Error incurred: ", e    
        db.rollback()
        db.close()
    
    print "Data loading complete.\n"
    

    谢谢,希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 2017-11-15
      • 1970-01-01
      • 2021-12-30
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      相关资源
      最近更新 更多