报错UnicodeEncodeError: 'latin-1' codec can't encode characters in position

前言

学习使用Python

报错图片

《报错UnicodeEncodeError: 'latin-1' codec can't encode characters in position》 报错

UnicodeEncodeError: ‘latin-1’ codec can’t encode characters in position 41-44: ordinal not in range(256)

题外话,简书的Markdown怎么不可以标红。

报错原因

我是利用Python3.x + xlrd + pymysql来实现从Excel读取数据,并导入MySQL中时,由于导入中文而报错。在不断的试错下,就是因为导入的中文才报的错。经多次百度,终于找到了原因,现记录下来,加深印象。

自行分析,只做参考,像jdbc一样,创建链接时需要指明用utf-8方式连接数据库

原来:

《报错UnicodeEncodeError: 'latin-1' codec can't encode characters in position》 原创建链接

改后:

《报错UnicodeEncodeError: 'latin-1' codec can't encode characters in position》 改后创建链接

例子源码:

# -*- coding: utf-8 -*-
# Created by Y.W. on 2017/7/31 17:46.

import pymysql
import xlrd

# 获取xlsx文件,获取sheet文件
try:
    book = xlrd.open_workbook('C:/users/yawa1hz1/desktop/file_name.xlsx')
    sheet = book.sheet_by_name(u'Sheet2')
except Exception as e:
    print(str(e))

# 打开数据库连接,并指明用utf-8方式连接数据库
db = pymysql.connect("localhost", "root", "123456", "test", use_unicode=True, charset="utf8")

# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()

# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS TEST1")

# 使用预处理语句创建表
createSql = """CREATE TABLE TEST1 (
          product  VARCHAR(20) NOT NULL,
          num  VARCHAR(5))"""

cursor.execute(createSql)

# 创建插入SQL语句
query = """INSERT INTO TEST1 (product, num) VALUES(%s,%s)"""

# 创建一个for循环迭代读取xlsx文件每行数据的, 从第二行开始是要跳过标题
for r in range(1, 3):
    product = sheet.cell(r, 0).value
    num = sheet.cell(r, 1).value

    values = (product, num)
    cursor.execute(query, values)

# 确认提交
db.commit()

# 关闭游标
cursor.close()

# 关闭数据库连接
db.close()

Excel:

《报错UnicodeEncodeError: 'latin-1' codec can't encode characters in position》 Excel

数据库结果:

《报错UnicodeEncodeError: 'latin-1' codec can't encode characters in position》 数据库

PS.数据库、Python和链接方式都得是UTF-8的。

    原文作者:砾桫_Yvan
    原文地址: https://www.jianshu.com/p/ba06af2b01d0
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞