報錯UnicodeEncodeError: 'latin-1' codec can't encode characters in position

前言

學習使用Python

報錯圖片

報錯

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方式連接數據庫

原來:

原創建鏈接

改后:

改后創建鏈接

例子源碼:

# -*- 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:

Excel

數據庫結果:

數據庫

PS.數據庫、Python和鏈接方式都得是UTF-8的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容