将 CSV 导入 Mysql Python 3.x

Posted

技术标签:

【中文标题】将 CSV 导入 Mysql Python 3.x【英文标题】:Importing CSV into Mysql Python 3.x 【发布时间】:2017-03-09 10:21:07 【问题描述】:

我正在尝试使用 python 将 csv 文件导入 mysql 以进行练习。我相信我已经下载了正确的库。每次我运行我的代码时,我都会收到错误:

mysql.connector.errors.ProgrammingError: 1064 (42000): 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 '%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)' 附近使用的正确语法第 1 行

我不知道为什么这不起作用,所有答案似乎都在使用不支持 python 3.x 的 mysqldb。

我的代码:

import mysql.connector
import pandas as pd

cnx = mysql.connector.connect(user='root', password='comeonin', host='127.0.0.1', database='boxresults')
cursor = cnx.cursor()
csv_data = pd.read_csv('Betting/boxresults3.csv')

for row in csv_data:
    cursor.execute("INSERT INTO table1(Week, Day, Date, Winner, Loser, PtsW, PtsL, YdsW, TOW, YdsL, TOL) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s, %s)", row)


cursor.close() 
cnx.close() 

新代码:

import mysql.connector
import pandas as pd

cnx = mysql.connector.connect(user='root', password='comeonin', host='127.0.0.1', database='boxresults')
cursor = cnx.cursor()
csv_data = pd.read_csv('Betting/boxresults3.csv') 

for row in csv_data.iterrows():
    list = row[1].values
    cursor.execute("INSERT INTO table1(Week, Day, Date, Winner, Loser, PtsW, PtsL, YdsW, TOW, YdsL, TOL) VALUES('%d','%s','%s','%s','%s','%d','%d','%d','%d','%d', '%d')" % tuple(list))

cursor.close() 
cnx.close() 

【问题讨论】:

打印row 看看你有什么。 execute() 需要包含 11 个元素的元组。 当我打印行时,我得到 11 个不同的列名,但我不认为它是一个元组。它正在一张一张地打印它们。 为什么会有 pandas 的开销? CSV 模块会很好。如果使用,pandas 会考虑将其to_sql 批量追加到一次调用中。即使 MySQL 仍然有用于文本文件的 LOAD DATA INFILE 命令。 mysqldb 有一个 Python 3 版本:pypi.python.org/pypi/mysqlclient --- 工作方式完全相同。另外,不确定这是否是 mysql.connector 的事情(顺便说一句,它的速度要慢得多),但是 %d 甚至可以工作吗? mysqldb 只允许 %s,无论类型如何......此外,行需要严格地是一个元组(再次,mysqldb,不确定但值得一提......)另外,不要像下面建议的那样在参数周围使用引号。 ..如果您还需要帮助,请告诉我,我会帮您解决... 【参考方案1】:

你错了row

 for row in csv_data 

row 中为您提供列名

要获取行,您需要iterrows()

 for row in csv_data.iterrows():

但是这个row不仅有values还有其他信息。您的值在 row[1] 中,但作为 Series 对象,因此您需要 values 将值作为列表获取

 for row in csv_data.iterrows():
     print( row[1].values )

完整的工作示例:

import pandas as pd

df = pd.DataFrame([[1,2,3], [4,5,6]], columns=['a','b','c'])

print(df)

for row in df.iterrows():
    print('type:', type(row[1]))
    print('values:', row[1].values)

结果:

   a  b  c
0  1  2  3
1  4  5  6
type: <class 'pandas.core.series.Series'>
values: [1 2 3]
type: <class 'pandas.core.series.Series'>
values: [4 5 6]

【讨论】:

这有助于我分解每一行。但是列表仍然无法输入到mysql中。我遇到了同样的错误。该列表是否没有正确输入为 11 个值,以期望执行中的 11 个值? 如果我使用引号('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')就可以了 我不得不对我的代码进行一些调整。我让它运行没有错误,但表没有填充任何东西。我在上面添加了我的新代码。 您需要cnx.commit() 才能将数据发送到数据库。

以上是关于将 CSV 导入 Mysql Python 3.x的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 将特定列数据从 CSV 导入不同的 MYSQL 表

利用Python将EXCEL,CSV,TSV导入Oracle或者MySQL

如何将csv导入mysql和mysql导出csv

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

如何把csv文件批量导入到mysql数据库

通过phpmyadmin将csv文件导入mysql