pandas to_sql给出了unicode解码错误

lat*_*s64 10 python unicode encoding utf-8 pandas

我有一个通过read_csv加载的pandas数据帧,当我尝试时,我试图通过to_sql将数据库推送到数据库

df.to_sql("assessmentinfo_pivot", util.ENGINE)
Run Code Online (Sandbox Code Playgroud)

我找回了unicodeDecodeError:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 83-84: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

to_sql没有编码选项来为to_sql指定utf-8,并且创建的Engine的编码设置为utf-8

ENGINE = create_engine("mssql+pymssql://" +
                       config.get_local('CEDS_USERNAME') + ':' +
                       config.get_local('CEDS_PASSWORD') + '@' +
                       config.get_local('CEDS_SERVER') + '/' +
                       config.get_local('CEDS_DATABASE'),
                       encoding="utf-8")
Run Code Online (Sandbox Code Playgroud)

任何大熊猫都能深入了解如何正常工作?我搜索的大部分内容都是让我遇到to_csv类似错误的人,这只是通过添加encoding ="utf-8"来解决,但遗憾的是这里不是一个选项.

我尝试将文件削减,但即使被剥离到标题,它仍然会出错:http://pastebin.com/F362xGyP

aly*_*bel 9

我遇到了与pymysql和pandas.to_sql组合完全相同的问题

更新,这对我有用:

不要将charset作为参数传递,而是尝试将其直接附加到连接字符串:

connect_string = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE)

问题似乎发生在pymysql中,并且错误的原因似乎是你定义的编码没有正确转发并在设置pymsql连接时设置.

为了调试,我哼了一声

encoding = 'utf-8

在pymysql _do_execute_many函数中,它向我解释.


小智 5

我在 python 3.7 上遇到了类似的问题。:UnicodeEncodeError: 'charmap' codec can't encode character '\ufffd' in position 0: character maps to

这是我定义引擎的方式。我在我的引擎中将字符集定义为 utf-8,但它没有选择它:

# Connecting to the database(reference for checkout_listener not added)
def MysqlConnection(DbName):
    DB_TYPE = 'mysql'
    DB_DRIVER = 'mysqldb'
    DB_NAME = DbName
    POOL_SIZE = 100
    CHARSET = 'utf-8'

    SQLALCHEMY_DATABASE_URI = '%s+%s://%s:%s@%s:%s/%s?%s' % (DB_TYPE, DB_DRIVER, DB_USER,
                                                             DB_PASS, DB_HOST, DB_PORT, DB_NAME, CHARSET)
    ENGINE1 = create_engine(
        SQLALCHEMY_DATABASE_URI, pool_size=POOL_SIZE, pool_recycle=3600, echo=False)
    event.listen(ENGINE1, 'checkout', checkout_listener)
    return (ENGINE1);
Run Code Online (Sandbox Code Playgroud)

这在 python 2 上运行良好,但在 python 3 上,会发生charmap 错误。我找到的唯一解决方案是以不同的方式编写引擎,并将字符集添加到定义字符串中:

connection_string = f"{mysql_user}:{mysql_password}@localhost:3306/{db_name}?charset=utf8"
engine = create_engine(f'mysql://{connection_string}')
Run Code Online (Sandbox Code Playgroud)