前言
學習使用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的。