【问题标题】:Load CSV data into MySQL in Python在 Python 中将 CSV 数据加载到 MySQL
【发布时间】:2012-04-26 15:10:36
【问题描述】:

不确定我在这里遗漏了什么,但此代码运行时没有任何错误消息,但表中没有任何内容。我正在将三列中的 CSV 值加载到 mysql 表中

import csv
import MySQLdb

mydb = MySQLdb.connect(host='localhost',
    user='root',
    passwd='',
    db='mydb')
cursor = mydb.cursor()

csv_data = csv.reader(file('students.csv'))
for row in csv_data:

    cursor.execute('INSERT INTO testcsv(names, \
          classes, mark )' \
          'VALUES("%s", "%s", "%s")', 
          row)
#close the connection to the database.
cursor.close()
print "Done"

如果其他人可以看看,将不胜感激。

【问题讨论】:

    标签: python mysql


    【解决方案1】:

    我认为你必须把mydb.commit()全部插入进去。

    类似的东西

    import csv
    import MySQLdb
    
    mydb = MySQLdb.connect(host='localhost',
        user='root',
        passwd='',
        db='mydb')
    cursor = mydb.cursor()
    
    csv_data = csv.reader(file('students.csv'))
    for row in csv_data:
    
        cursor.execute('INSERT INTO testcsv(names, \
              classes, mark )' \
              'VALUES("%s", "%s", "%s")', 
              row)
    #close the connection to the database.
    mydb.commit()
    cursor.close()
    print "Done"
    

    【讨论】:

    • 谢谢它的工作:) 但是你知道为什么数据库中的值都用单引号括起来吗?
    • 试试"insert into testcsv(names, classes, mark) values(%s, %s, %s)", row
    • Danke,如果您有任何其他问题,请发布一个新问题:D
    • @JakobBowyer 如何忽略 csv 中的第一行。
    • 为此,您需要在加载任何 CSV 之前找出并创建具有正确架构的表。如果您的数据包含数字列和/或您的数据中缺少(NULL)值,这种方法也会给您带来很多问题。这些问题可以通过下面的 pandas/sqlalchemy 方法自动处理。
    【解决方案2】:

    如果您没有 pandassqlalchemy 库,请使用 pip 导入

    pip install pandas
    pip install sqlalchemy
    

    我们可以使用pandassqlalchemy直接插入数据库

    import csv
    import pandas as pd
    from sqlalchemy import create_engine, types
    
    engine = create_engine('mysql://root:*Enter password here*@localhost/*Enter Databse name here*') # enter your password and database names here
    
    df = pd.read_csv("Excel_file_name.csv",sep=',',quotechar='\'',encoding='utf8') # Replace Excel_file_name with your excel sheet name
    df.to_sql('Table_name',con=engine,index=False,if_exists='append') # Replace Table_name with your sql table name
    

    【讨论】:

    【解决方案3】:

    上面的答案似乎不错。但另一种方法是添加自动提交选项以及 db connect。这会自动提交在数据库中执行的所有其他操作,避免每次都使用提及sql.commit()

     mydb = MySQLdb.connect(host='localhost',
            user='root',
            passwd='',
            db='mydb',autocommit=true)
    

    【讨论】:

      【解决方案4】:
        from __future__ import print_function
      import csv
      import MySQLdb
      
      print("Enter  File  To Be Export")
      conn = MySQLdb.connect(host="localhost", port=3306, user="root", passwd="", db="database")
      cursor = conn.cursor()
      #sql = 'CREATE DATABASE test1'
      sql ='''DROP TABLE IF EXISTS `test1`; CREATE TABLE test1 (policyID int, statecode varchar(255), county varchar(255))'''
      cursor.execute(sql)
      
      with open('C:/Users/Desktop/Code/python/sample.csv') as csvfile:
          reader = csv.DictReader(csvfile, delimiter = ',')
          for row in reader:
              print(row['policyID'], row['statecode'], row['county'])
              # insert
              conn = MySQLdb.connect(host="localhost", port=3306, user="root", passwd="", db="database")
              sql_statement = "INSERT INTO test1(policyID ,statecode,county) VALUES (%s,%s,%s)"
              cur = conn.cursor()
              cur.executemany(sql_statement,[(row['policyID'], row['statecode'], row['county'])])
              conn.escape_string(sql_statement)
              conn.commit()
      

      【讨论】:

        【解决方案5】:

        如果有帮助,请使用 pymsql

        import pymysql
        import csv
        db = pymysql.connect("localhost","root","12345678","data" )
        
        cursor = db.cursor()
        csv_data = csv.reader(open('test.csv'))
        next(csv_data)
        for row in csv_data:
            cursor.execute('INSERT INTO PM(col1,col2) VALUES(%s, %s)',row)
        
        db.commit()
        cursor.close()
        

        【讨论】:

        • 感谢您的提示,但这是 8 年前提出的 :)
        • @HelenNeely 同意是时候选择我的答案作为正确答案了,因为 open(file) 不起作用:P
        • 相当原始,考虑到使用 pandas 提供的更简单的选项。
        • @MurtazaHaji 不,很简单,如果我们不想使用 pandas 或/和 sqalchemy 或 sqlite。
        • @HelenNeely 无论何时提出问题,SO 都可以作为与 8 年前有相同问题的人的持续参考。因此,随着现有答案变得无关紧要,不断提供新答案是有意义的。
        【解决方案6】:

        如果是 pandas 数据框,你可以这样做:

        发送数据

        csv_data.to_sql=(con=mydb, name='<the name of your table>',
          if_exists='replace', flavor='mysql')
        

        避免使用for

        【讨论】:

        • 您似乎引用了手册?请在这种情况下添加参考,以便人们在感兴趣的情况下继续阅读(并对原作者提供适当的参考)。
        • 如果数据框的索引名称与数据库表中的列名称不同,这将不起作用。
        【解决方案7】:

        最快的方法是通过“load data infile”语句使用 MySQL 批量加载器。这是迄今为止你在 Python 中想出的任何方法中最快的方法。如果你必须使用 Python,你可以从 Python 本身调用语句“load data infile”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-04
          • 2016-04-17
          • 2018-04-08
          • 2012-01-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多