Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python将CSV记录导入MySQL数据库_Python_Mysql_Sql_Database_Csv - Fatal编程技术网

用Python将CSV记录导入MySQL数据库

用Python将CSV记录导入MySQL数据库,python,mysql,sql,database,csv,Python,Mysql,Sql,Database,Csv,我正在尝试读取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,MEDINST

我正在尝试读取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和下面的表名

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字段的字符数超过数据库中该列允许的最大字符数

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
count=0
对于csv_数据中的行:
如果计数小于1:
持续
其他:
当前执行(“插入零件表测试(ID、学校代码、地区名称、年份、学校名称、州名称、区块名称、集群名称、村庄名称、PINCODE、RURURB、电气代码、SCHMGT、低级、高级、计算机、CAL代码、MEDINSTR1、MEDINSTR2、MEDINSTR3、MEDINSTR4)值(%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s、%s),%s、%s、%s、%s、%s、%s、%s)”,行)
计数+=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)

跳过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”
被分配给一个double。这将在MySQL中计算为0,但该转换将导致MySQL抛出错误或警告。行为取决于会话的
sql\u模式设置。

请检查CSV文件,我在其中提供了一些数据。您已将ID作为双精度插入,而它应该是整数。提示MySQL可以使用
加载数据填充直接读取CVS文件
是的,这是第一行,标题行,这导致MySQL在将字符串
“ID”
转换为数字(双精度)时抛出错误/警告。从文件中提取并丢弃第一行可以避免这种情况+10