Python编程:Python2编码问题与pymysql查询结果乱码解决

简介: Python编程:Python2编码问题与pymysql查询结果乱码解决

订阅专栏

Python2编码一直是个让人头疼的问题,能够让一个充满激情的新手,从刚安装完python解释器到放弃。

我就曾经放弃过,后来又拿了起来,真是一波多折。


so,如果可能就尽量使用Python3吧


下面我就python2通过pymysql处理查询结果为例说明


要查询的数据表(包含中文)

mysql> use demo
mysql> select * from names limit 3;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 大红   |   24 |
|  2 | 大壮   |   24 |
|  3 | 秀英   |   24 |
+----+--------+------+

python2原始代码

from collections import namedtuple
import pymysql
db = pymysql.Connect(
    host="localhost",
    user="root",
    password="123456",
    database="demo",
    port=3306
)
sql = "select name, age from names limit 3"
cursor = db.cursor()
cursor.execute(sql)
rows = cursor.fetchall()
cursor.close()
db.close()
print(rows)
Row = namedtuple("Row", ["name", "age"])
rows = map(Row._make, rows)
for row in rows:
    person = "{}{}".format(row.name, row.age)
    print(person)

1、SyntaxError: Non-ASCII character

看着好好的代码,莫名其妙的来个语法错误SyntaxError: Non-ASCII character

SyntaxError: Non-ASCII character '\xe5' in file text.py on line 56, 
but no encoding declared; 
see http://python.org/dev/peps/pep-0263/ for details

根据报错提示的链接: http://python.org/dev/peps/pep-0263/

打开后发现需要在文件头加文件编码说明

# coding=utf-8

或者

#!/usr/bin/python
# -*- coding: utf-8 -*-

2、中文变成了?

添加完文件编码后,继续运行代码,代码文件中有print(rows)print(person)打印出来的内容分别是:

(('??', 24), ('??', 24), ('??', 24))
??24
??24
??24

what? 查看pymysql.Connect 的源码,发现有一个参数charset字符集,那么添加一个字符编码试试

db = pymysql.Connect(
    host="localhost",
    user="root",
    password="123456",
    database="demo",
    port=3306,
    # 添加字符编码
    charset="utf8"
)

3、UnicodeEncodeError

添加完编码字符集参数后,运行又报错了!

((u'\u5927\u7ea2', 24), (u'\u5927\u58ee', 24), (u'\u79c0\u82f1', 24))
Traceback (most recent call last):
  File "text.py", line 37, in <module>
    person = "{}{}".format(row.name, row.age)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

发现print(rows)已经打印了,而且没有?,前面带u,说明是unicode字符

报错代码是:person = "{}{}".format(row.name, row.age),使用format格式化报错

明明已经在文件开头指定了文件的编码是utf-8了,怎么还是说unicode呢?

百思不得其解,经过百度,google,发现只用添加以下代码就行:

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

或者

from __future__ import unicode_literals

推荐使用后者

参考

1.https://stackoverflow.com/questions/3828723/why-should-we-not-use-sys-setdefaultencodingutf-8-in-a-py-script

2.https://stackoverflow.com/questions/9942594/unicodeencodeerror-ascii-codec-cant-encode-character-u-xa0-in-position-20

运行代码文件,发现输出正常了

((u'\u5927\u7ea2', 24), (u'\u5927\u58ee', 24), (u'\u79c0\u82f1', 24))
大红24
大壮24
秀英24

当然,直接打印整个元组对象是不能直观的看到内容的,打印出来的是unicode码,而python3就可以

总结

好了,一路过来解决3个编码问题,都需要设置编码为utf-8

报错

解决 示例
SyntaxError: Non-ASCII character 文件编码 # -*- coding: utf-8 -*-

中文变成了?

数据库连接编码 charset="utf8"
UnicodeEncodeError 引入py3的新特性 from __future__ import unicode_literals

注意,pymysql的编码设置charset="utf8"中间没有-

python2中的编码问题基本可以用以下两行代码解决

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

给出最后的完整代码

# -*- coding: utf-8 -*-
# @Date    : 2018-12-20
# @Author  : Peng Shiyu
from __future__ import unicode_literals
from collections import namedtuple
import pymysql
db = pymysql.Connect(
    host="localhost",
    user="root",
    password="123456",
    database="demo",
    port=3306,
    charset="utf8"
)
sql = "select name, age from names limit 3"
cursor = db.cursor()
cursor.execute(sql)
rows = cursor.fetchall()
cursor.close()
db.close()
print(rows)
Row = namedtuple("Row", ["name", "age"])
rows = map(Row._make, rows)
for row in rows:
    person = "{}{}".format(row.name, row.age)
    print(person)
"""
((u'\u5927\u7ea2', 24), (u'\u5927\u58ee', 24), (u'\u79c0\u82f1', 24))
大红24
大壮24
秀英24
"""


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
2月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
211 3
|
2月前
|
数据处理 Python
Python编程:类型转换与输入输出
本教程介绍Python中输入输出与类型转换的基础知识,涵盖input()和print()的使用,int()、float()等类型转换方法,并通过综合示例演示数据处理、错误处理及格式化输出,助你掌握核心编程技能。
479 3
|
2月前
|
并行计算 安全 计算机视觉
Python多进程编程:用multiprocessing突破GIL限制
Python中GIL限制多线程性能,尤其在CPU密集型任务中。`multiprocessing`模块通过创建独立进程,绕过GIL,实现真正的并行计算。它支持进程池、队列、管道、共享内存和同步机制,适用于科学计算、图像处理等场景。相比多线程,多进程更适合利用多核优势,虽有较高内存开销,但能显著提升性能。合理使用进程池与通信机制,可最大化效率。
295 3
|
2月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
302 0
|
3月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
316 102
|
3月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
345 104
|
3月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
274 103
|
3月前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
206 82
|
3月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的多面手
Python:现代编程的多面手
92 0
|
3月前
|
存储 人工智能 算法
Python实现简易成语接龙小游戏:从零开始的趣味编程实践
本项目将中国传统文化与编程思维相结合,通过Python实现成语接龙游戏,涵盖数据结构、算法设计与简单AI逻辑,帮助学习者在趣味实践中掌握编程技能。
393 0

推荐镜像

更多