python编码问题在此终结
1 版本差异概览
1.1 Python 2.X:
- str(用于8位文本和二进制数据)
- unicode(用于宽字符文本)
在Python2中,通用的str类型填补了二进制数据的这一角色(特指python3中的bytes类型),因为字符串也只是字节的序列(单独的unicode类型处理宽字符串)。
在Python2中,为了兼容性而使用b'xxx',但是它与'xxx'是相同的,并且产生一个str,并且,bytes只是str的同义词。在Python3中,这二者都解决了bytes类型之间的差异。Python2中的u'xxx'和 U'xxx' Unicode字符串常量形式在Python3中已经取消了,而是使用'xxx'替代,因为所有的字符串都是Unicode,即便它们包含所有的ASCII字符。
1.2 Python 3.X:
- str(用于Unicode文本,包括ASCII)
- bytes(用 于带有绝对字节值的二进制数据)
- bytearray(bytes的一种可变的形式)
bytes是一个不可改变的字符序列。
Python 3.0 bytes对象是较小整数的一个序列,其中每个整数都在0到255之间。在python3中bytes主要用于处理那些没有针对每个任意文本格式都编码的raw字节数据(图像和声音文件,以及用来与设备接口的打包数据,或者你想要用python的struct模块处理的C程序)。Python3的bytes类型支持几乎str类型所做的所有相同操作:这包括字符串方法、序列操作,甚至re模块模式匹配。
bytearray是bytes类型的一个变体,它是可变的并且支持原处修改。
它支持str和bytes所支持的常见的字符串操作,以及和列表相同的很多原处修改操作(例如,append和extend方法, 以及向索引赋值)。
1.3文件分类
python3中的文件I/O一般分为两类:文本文件和二进制文件
使用建议:
1.如果正在处理图像文件,其他程序创建的、而且必须解压的打包数据,或者一些设 备数据流,则使用bytes和二进制模式文件处理它更合适。如果想要更新数据而不 在内存中产生其副本,也可以选择使用bytearray。
2.如果要处理的内容实质是文本的内容,例如程序输出、H T M L、国际化文本或 CSV或XML文件,可能要使用str和文本模式文件。
2 类型转换
Python 3.0下的类型转换:
• str.encode()和bytes(S, encoding)把一个字符串转换为其raw bytes形式,并且
在此过程中根据一个str创建一个bytes。
• bytes.decode()和str(B, encoding)把raw bytes转换为其字符串形式,并且在此
过程中根据一个bytes创建一个str。
>>> S = 'eggs'
>>> S.encode()
b'eggs'
>>> bytes(S, encoding='ascii')
b'eggs'
>>> B = b'spam'
>>> B.decode()
'spam'
>>> str(B, encoding='ascii')
'spam'
3 平台默认编码
3.1 查看系统编码
python2系统编码
Python 2.7.10 (default, Jul 30 2016, 19:40:32)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
python3系统编码
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 26 2016, 10:47:25)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
3.2 修改系统编码
如果程序执行的过程中,遇到下面的报错信息时,可以把Python2的系统编码改为utf-8。
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1....
#Python2的系统编码改为utf-8,一般放在文件头
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
4 chardet模块
chardet是python的一个第三方库,常用于编码识别。
4.1 网页编码判断:
from urllib import request
import chardet
rawdata = request.urlopen('https://www.baidu.com/').read()
tmp = chardet.detect(rawdata)
print(tmp)
"""
{'encoding': 'ascii', 'confidence': 1.0}
confidence:检测精确度
encoding:编码形式
"""
4.2 文件编码判断
import chardet
with open('text.txt', 'rb') as f:
data = f.readline()
tmp = chardet.detect(data)
print(tmp)
"""
{'encoding': 'ascii', 'confidence': 1.0}
"""
5 源文件字符集编码声明
对于在脚本文件中编码的字 符串,python默认地使用UTF-8编码,但是,它允许我们通过包含一个注释来指明想要 的编码,从而将默认值修改为支持任意的字符集。这个注释必须拥有如下的形式,并且 在Python 2.6或Python 3.0中必须作为脚本的第一行或第二行出现:
# -*- coding: latin-1 -*-
6 pickle序列化与编码
pickle模块的Python3版本总是创建一个bytes对象
>>> import pickle
>>> pickle.dumps([1, 2, 3])
b'\x80\x03]q\x00(K\x01K\x02K\x03e.'
>>> pickle.dumps([1, 2, 3], protocol=0)
b'(lp0\nL1L\naL2L\naL3L\na.'
序列化于反序列化(在python2与python3中都生效):
>>> import pickle
>>> pickle.dump([1, 2, 3], open('temp', 'wb'))
>>> pickle.load(open('temp', 'rb'))
[1, 2, 3]
7 编码相关的其他方法
sys/locale模块中提供了一些获取当前环境下的默认编码的方法。
# coding:gbk
import sys
import locale
def p(f):
print '%s.%s(): %s' % (f.__module__, f.__name__, f())
# 返回当前系统所使用的默认字符编码
p(sys.getdefaultencoding)
# 返回用于转换Unicode文件名至系统文件名所使用的编码
p(sys.getfilesystemencoding)
# 获取默认的区域设置并返回元祖(语言, 编码)
p(locale.getdefaultlocale)
# 返回用户设定的文本数据编码
# 文档提到this function only returns a guess
p(locale.getpreferredencoding)
python编码问题在此终结的更多相关文章
- (转载) 浅谈python编码处理
最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...
- Python 编码简单说
先说说什么是编码. 编码(encoding)就是把一个字符映射到计算机底层使用的二进制码.编码方案(encoding scheme)规定了字符串是如何编码的. python编码,其实就是对python ...
- Python之路3【知识点】白话Python编码和文件操作
Python文件头部模板 先说个小知识点:如何在创建文件的时候自动添加文件的头部信息! 通过:file--settings 每次都通过file--setings打开设置页面太麻烦了!可以通过:View ...
- python编码规范
python编码规范 文件及目录规范 文件保存为 utf-8 格式. 程序首行必须为编码声明:# -*- coding:utf-8 -*- 文件名全部小写. 代码风格 空格 设置用空格符替换TAB符. ...
- 【转】python编码的问题
摘要: 为了在源代码中支持非ASCII字符,必须在源文件的第一行或者第二行显示地指定编码格式: # coding=utf-8 或者是: #!/usr/bin/python # -*- coding: ...
- 【转】python编码规范
http://blog.csdn.net/willhuo/article/details/49300441 决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是 ...
- python 编码 UnicodeDecodeError
将一个py脚本从Centos转到win运行,出错如下: UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: il ...
- Python编码/文件读取/多线程
Python编码/文件读取/多线程 个人笔记~~记录才有成长 编码/文件读取/多线程 编码 常用的一般是gbk.utf-8,而在python中字符串一般是用Unicode来操作,这样才能按照单个字 ...
- 关于Python编码,超诡异的,我也是醉了
Python的编码问题,真是让人醉了.最近碰到的问题还真不少.比如中文文件名.csv .python对外呈现不一致啊,感觉好不公平. 没图说个JB,下面立马上图. 我早些时候的其他脚本,csv都是 ...
随机推荐
- 公历和农历转换的JS代码(车)
<!-- function CalConv(M) { FIRSTYEAR = 1936; LASTYEAR = 2031; LunarCal = [ new tagLunarCal(23, 3, ...
- Confluence 6 通过 SSL 或 HTTPS 运行 - 备注和问题解决
备注 在创建证书时候的背景信息: 'keytool -genkeypair' 命令将会创建秘钥对,包括公钥和关联的私钥,然后存储到 keystore 中.这个命令打包公钥为 X.509 v3 自签 ...
- npm安装依赖包 --save-dev 和 --save; package.json的devDependencies和dependencies 的区别!
以前一直在纠结一个npm安装的包依赖管理的问题.是这样的: 我们在使用npm install 安装模块或插件的时候,有两种命令把他们写入到 package.json 文件里面去,他们是:--save- ...
- bitset用法详解
参见此博客: https://www.cnblogs.com/magisk/p/8809922.html
- JS实现简单的观察者模式
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 饮冰三年-人工智能-Python-16Python基础之迭代器、生成器、装饰器
一:迭代器: 最大的特点:节省内存 1.1 迭代器协议 a:对象必须提供一个next方法, b:执行方法要么返回迭代中的下一项,要么抛弃一个Stopiteration异常, c:只能向后不能向前. 1 ...
- linux基础练习题(2)
Linux命令作业(关卡二) 练习题1 理解操作系统的作用,以及各种操作系统的不同 要求: 为什么要有OS?没有OS能行吗?原因是什么? Linux内核指的是什么? Linux主要应用在哪些地方? 使 ...
- 51Nod 1298 圆与三角形(计算几何)
1298 圆与三角形 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes&quo ...
- linux服务器上简单命令
linux命令 1.ifconfig 查看 设置ip: 2.连接另一台linux 命令 ssh; 3.查看尾部 新追加内容 tail -f; 4.ln -s 原命令 新命令路径: 5.创建一个空文件 ...
- Redis 学习手册
一:Redis的简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包 ...