56

不确定我在这里遗漏了什么,但此代码运行时没有任何错误消息,但表中没有任何内容。我正在将三列中的 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"

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

4

7 回答 7

81

我认为你必须做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"
于 2012-04-14T15:11:44.340 回答
16

如果您没有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
于 2019-09-23T04:10:08.143 回答
9

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

 mydb = MySQLdb.connect(host='localhost',
        user='root',
        passwd='',
        db='mydb',autocommit=true)
于 2018-07-04T09:49:16.990 回答
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()
于 2017-07-14T12:36:55.070 回答
4

如果有帮助,请使用 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()
于 2020-05-14T07:24:06.930 回答
1

如果它是熊猫数据框,您可以这样做:

发送数据

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

避免使用for.

于 2016-10-08T15:26:52.337 回答
0

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

于 2020-12-15T07:58:11.850 回答