带有字符编码的 Python MySQL 批量插入错误
Posted
技术标签:
【中文标题】带有字符编码的 Python MySQL 批量插入错误【英文标题】:Python MySQL Bulk Insertion Error with Character Encode 【发布时间】:2016-12-28 12:35:33 【问题描述】:我使用 MySQL 在 Python 中启动新项目。
我只是尝试通过 MySQLdb 包将数百万条记录从 CSV 插入到 MySQL。
我的代码:
import pandas as pd
import mysqldb
#Connect with MySQL
db = MySQLdb.connect('localhost','root','****','MY_DB')
cur = db.cursor()
#Reading CSV
df = pd.read_csv('/home/shankar/LAB/Python/Rough/******.csv')
for i in df.COMPANY_NAME:
i = i.replace("'","")
i = i.replace("\\","")
#i = i.encode('latin-1', 'ignore')
cur.execute("INSERT INTO polls_company (name) VALUES ('" + i + "')")
db.commit()
此代码在某些 CSV 文件中运行良好,但在少数 CSV 文件中存在问题。
错误:
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
<ipython-input-7-aac849862588> in <module>()
13 i = i.replace("\\","")
14 #i = i.encode('latin-1', 'ignore')
---> 15 cur.execute("INSERT INTO polls_company (name) VALUES ('" + i + "')")
16 db.commit()
/home/shankar/.local/lib/python3.5/site-packages/MySQLdb/cursors.py in execute(self, query, args)
211
212 if isinstance(query, unicode):
--> 213 query = query.encode(db.unicode_literal.charset, 'surrogateescape')
214
215 res = None
UnicodeEncodeError: 'latin-1' codec can't encode character '\ufffd' in position 49: ordinal not in range(256)
这里,这个“字符编码”问题仅出现在某些 CSV 文件中,但我希望使用常用编码技术自动插入。
因为 CSV 文件编码适用于“utf-8”、“latin-1”等...
如果我使用 utf-8 :那么我在 latin-1 中出现错误 反之亦然
那么,有什么方法可以操作各种通用编码的CSV文件
或
还有其他方法可以解决这个问题吗?
[提前致谢...]
【问题讨论】:
【参考方案1】:我会让 pandas 负责编码,而您无需遍历 DF。让我们用熊猫的方式来做吧:
import pandas as pd
import MySQLdb
#Connect with MySQL
db = MySQLdb.connect('localhost','root','****','MY_DB')
cur = db.cursor()
#Reading CSV
df = pd.read_csv('/home/shankar/LAB/Python/Rough/******.csv')
df.COMPANY_NAME.str.replace(r"['\]*", "").rename(columns='COMPANY_NAME':'name').to_sql('polls_company', db, if_exists='append', index=False)
【讨论】:
那么,如果我处理多于一列意味着什么? 但此代码生成错误为“错误:位置 0 处的未终止字符集”以上是关于带有字符编码的 Python MySQL 批量插入错误的主要内容,如果未能解决你的问题,请参考以下文章