【问题标题】:Importing data from CSV to MySQL using python使用python将数据从CSV导入MySQL
【发布时间】:2020-08-06 23:26:36
【问题描述】:

我目前正在从事一个学校项目,我正在尝试使用 python 将数据从 CSV 文件导入 MySQL。到目前为止,这是我的代码:

import mysql.connector
import csv

mydb = mysql.connector.connect(host='127.0.0.1', user='root', password='abc123!', db='jd_university')

cursor = mydb.cursor()

with open('C:/Users/xxxxxx/Downloads/Students.csv') as csvfile:
    reader = csv.DictReader(csvfile, delimiter=',')
    for row in reader:
        cursor.execute('INSERT INTO Student (First_Name, Last_Name, DOB, Username, Password, Phone_nr,'
                       'Email, StreetName_nr, ZIP) '
                       'VALUES("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")',
                       row)

mydb.commit()
cursor.close()

当我运行它时,我得到这个错误:“mysql.connector.errors.DataError: 1292 (22007): Incorrect date value: '%s' for column 'DOB' at row 1"

CSV 文件中使用的日期格式为 yyyy-mm-dd

这方面的任何提示都会有很大帮助!

【问题讨论】:

  • 你能给我们展示前三行样本数据吗?它是否包含包含列名的标题行?
  • 您应该在问题中记录一些示例数据,例如print(row) 用于调试目的。完成删除后就可以了。

标签: python mysql python-3.x csv


【解决方案1】:
  • 您无需引用 %s 占位符。
  • 由于您使用的是 DictReader,因此您需要在 row 表达式中命名列(或者不使用 DictReader 并希望获得正确的顺序,我不会这样做)。

试试这个:

import mysql.connector
import csv

mydb = mysql.connector.connect(
    host="127.0.0.1", user="root", password="abc123!", db="jd_university"
)

cursor = mydb.cursor()

with open("C:/Users/xxxxxx/Downloads/Students.csv") as csvfile:
    reader = csv.DictReader(csvfile, delimiter=",")
    for row in reader:
        values = [
            row["First_Name"],
            row["Last_Name"],
            row["DOB"],
            row["Username"],
            row["Password"],
            row["Phone_nr"],
            row["Email"],
            row["StreetName_nr"],
            row["ZIP"],
        ]
        cursor.execute(
            "INSERT INTO Student (First_Name, Last_Name, DOB, Username, Password, Phone_nr,"
            "Email, StreetName_nr, ZIP) "
            "VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)",
            values,
        )

mydb.commit()
cursor.close()

【讨论】:

  • 谢谢!这似乎有效,我之前得到的错误现在已经消失了。但是,如果数据库中的 ZIP 列是 INT 值,我将如何解决?
  • row["ZIP"] 替换为 int(row["ZIP"]),以便在将值传递给 MySQL 之前进行转换。
  • 非常感谢!数据现已导入 MySQL
【解决方案2】:

验证数据文件和数据库列中 DOB 字段的数据类型。可能是数据问题或表定义问题。

【讨论】:

    猜你喜欢
    • 2020-05-06
    • 2015-02-07
    • 1970-01-01
    • 2013-02-19
    • 2019-10-17
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多