【问题标题】:Python MySQL Bulk Insertion Error with Character Encode带有字符编码的 Python MySQL 批量插入错误
【发布时间】:2016-12-28 12:35:33
【问题描述】:

我使用 MySQLPython 中启动新项目。

我只是尝试通过 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文件

还有其他方法可以解决这个问题吗?

[提前致谢...]

【问题讨论】:

    标签: python mysql csv pandas mysql-python


    【解决方案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 处的未终止字符集”
    猜你喜欢
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2017-01-01
    • 1970-01-01
    相关资源
    最近更新 更多