在 Python 中将 CSV 记录导入 MySQL 数据库

Posted

技术标签:

【中文标题】在 Python 中将 CSV 记录导入 MySQL 数据库【英文标题】:import CSV record into MySQL Database in Python 【发布时间】:2018-11-10 14:25:30 【问题描述】:

我正在尝试读取 CSV 文件并将记录导入 mysql 表。 CSV 文件看起来像,

db_columns.csv :-

ID,SCHOOL_CODE,DISTNAME,AC_YEAR,SCHOOL_NAME,STATE_NAME,BLOCK_NAME,CLUSTER_NAME,VILLAGE_NAME,PINCODE,RURURB,ELECTRIC_YN,SCHMGT,LOWCLASS,HIGHCLASS,COMPUTER,CAL_YN,MEDINSTR1,MEDINSTR2,MEDINSTR3,MEDINSTR4
0,35010103903,ANDAMANS,2015-16,PRIMARY SCHOOL INVENT PUBLIC (PU),Andaman And Nicobar,BRC- SOUTH ANDAMAN,"DIET, GARACHARMA",BATHUBASTHI,744105,2,1,5,1,5,4,1,19,98,98,98
1,35010101902,ANDAMANS,2015-16,GOVT PRIMARY SCHOOL MAKKA PAHAR,Andaman And Nicobar,BRC- SOUTH ANDAMAN,GSSS RANGACHANG,CALICUT,744105,1,1,1,1,5,0,2,16,19,98,98

MySQL 表的样子,

+--------------+--------------+
| column_name  | column_type  |
+--------------+--------------+
| ID           | double       |
| SCHOOL_CODE  | double       |
| DISTNAME     | varchar(100) |
| AC_YEAR      | varchar(25)  |
| SCHOOL_NAME  | varchar(300) |
| STATE_NAME   | varchar(100) |
| BLOCK_NAME   | varchar(200) |
| CLUSTER_NAME | varchar(200) |
| VILLAGE_NAME | varchar(200) |
| PINCODE      | varchar(100) |
| RURURB       | double       |
| ELECTRIC_YN  | double       |
| SCHMGT       | double       |
| LOWCLASS     | double       |
| HIGHCLASS    | double       |
| COMPUTER     | double       |
| CAL_YN       | double       |
| MEDINSTR1    | double       |
| MEDINSTR2    | double       |
| MEDINSTR3    | double       |
| MEDINSTR4    | double       |
+--------------+--------------+
21 rows in set (1.20 sec)

我写的 Python 代码,

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

db = MySQLdb.connect(host="localhost",    # your host, usually localhost
                     user="admin",         # your username
                     passwd="admin",  # your password
                     db="School_Test")        # name of the data base

cur = db.cursor()

csv_data = csv.reader(file('db_columns.csv'))

for row in csv_data:

    cur.execute ("INSERT INTO part_table_test (ID,SCHOOL_CODE,DISTNAME,AC_YEAR,SCHOOL_NAME,STATE_NAME,BLOCK_NAME,CLUSTER_NAME,VILLAGE_NAME,PINCODE,RURURB,ELECTRIC_YN,SCHMGT,LOWCLASS,HIGHCLASS,COMPUTER,CAL_YN,MEDINSTR1,MEDINSTR2,MEDINSTR3,MEDINSTR4) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",row)

db.close()

下面的数据库和表名,

DB Name :- School_Test
Table Name :- part_table_test
CSV File Name :- db_columns.csv

当我运行代码时,它给了我错误:-

_mysql_exceptions.DataError: (1265, "Data truncated for column 'ID' at row 1")

我正在尝试解决此错误。推荐的方法应该是什么?

【问题讨论】:

请检查 CSV 文件,我提供的数据很少 您已将您的 ID 作为双精度插入,而它应该是一个整数。 小提示MySQL可以用LOAD DATA INFILEdev.mysql.com/doc/refman/8.0/en/load-data.html直接读取CVS文件 【参考方案1】:

创建阅读器时,它将遍历 csv 文件的所有行,包括包含标题的第一行。 尝试通过在 for 循环之前调用 next 来丢弃它们:

csv_data = csv.reader(file('db_columns.csv'))
next(csv_data) # discard header
for row in csv_data:
    cur.execute ("INSERT INTO part_table_test (ID,SCHOOL_CODE,DISTNAME,AC_YEAR,SCHOOL_NAME,STATE_NAME,BLOCK_NAME,CLUSTER_NAME,VILLAGE_NAME,PINCODE,RURURB,ELECTRIC_YN,SCHMGT,LOWCLASS,HIGHCLASS,COMPUTER,CAL_YN,MEDINSTR1,MEDINSTR2,MEDINSTR3,MEDINSTR4) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",row)

【讨论】:

是的,当 MySQL 将字符串 "ID" 转换为数字(双精度)时,正是第一行,即标题行导致 MySQL 抛出错误/警告。从文件中获取并丢弃第一行将避免这种情况。 +10。【参考方案2】:

这通常意味着 CSV 中的 ID 字段的字符数超过了数据库中该列允许的最大字符数。

1) 尝试改变

    csv_data = csv.reader(file('db_columns.csv'), delimiter=',')

2) 还要将 ID 的类型更改为 INT 或 BIGINT

3) 不要忘记跳过初始行(标题),因为它会将列名插入数据库并失败

    count = 0
    for row in csv_data:
        if count < 1:
            continue
        else:
            cur.execute ("INSERT INTO part_table_test (ID,SCHOOL_CODE,DISTNAME,AC_YEAR,SCHOOL_NAME,STATE_NAME,BLOCK_NAME,CLUSTER_NAME,VILLAGE_NAME,PINCODE,RURURB,ELECTRIC_YN,SCHMGT,LOWCLASS,HIGHCLASS,COMPUTER,CAL_YN,MEDINSTR1,MEDINSTR2,MEDINSTR3,MEDINSTR4) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",row)
        count+=1

【讨论】:

【参考方案3】:

跳过 CSV 文件中的第一行,即标题行,然后处理其余行。

  csv_data = csv.reader(file('db_columns.csv'))

  # retrieve the header line and discard it
  next(csv_data, None)

  for row in csv_data:

我认为错误来自第一行,字符串值"ID" 被分配给一个双精度值。这将在 MySQL 中评估为 0,但该转换将导致 MySQL 抛出错误或警告。该行为取决于会话的sql_mode 设置。

【讨论】:

以上是关于在 Python 中将 CSV 记录导入 MySQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中将csv文件导入为numpy.array? [复制]

在 Python 中将数据导入命名元组

在python中将html表转换为csv

在导入的 .csv 中将字符串更改为浮点数

在 Windows 中将 csv 导入 hdfs 时出错

如何在windows的“omnidb”中将csv文件数据导入postgresql