将 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