python 中 编码
编码就是将人类识别的字符转计算机可以识别的二进制 及逆向的过程
-
ascii 码
-
计算机最早由美国人发明,他们本身没有太多符号需要编译
-
设计 8 位 256 种可能就可以完全够用
-
8位一个字节,所以 ascii 码是一个单字节编码表
-
里面没有中文和其它国家的符号,所以计算机推广到全世界后不能通用
-
-
gb2312: 中国基于自已的语言设计的一种编码方式,不能涵盖所有的汉字
-
......
-
unicode
-
如果每个国家都采用自已的编码,不利于信息的传播,如此产生了 万国码
-
规定 四个字符存储一个符号
-
英文本身只需一个字节就够,所以这种编码在存储文件时会造成大量的空间浪费
-
-
utf8
-
类似的有 utf32 utf16 ,都可以认为是 Unicode 的升级,变长存储
-
定义一个英文按1个字节,一个中文按3个字节
-
python 中的编码
-
在 python3 中字符是以 Unicode 存储于内存中的
-
unicode 定长存在于内存中,便于寻址查找,提高速度
-
因为 Unicode 可能存在空间 “浪费”,所以写入硬盘中的内容是 bytes
-
支持 bytes 的编码有 Utf8 gbk 等【非unicode】
-
综上所述:
-
文件内容读取到内存中时 需要 decode 为 unicode
-
内存中的文件写入到硬盘时 需要 endcode 为 bytes
-
python里的 open 方法
01 read模式
f = open("***", "r", endcoding="编码位")
# 不要纠结是 open 还是 with open ,还没写 close 呢
-
常见问题: 如果不指定 encoding 时会报
gbk can not decode byte.....
-
思考:
-
上述现象一定是编码问题
-
需要确认当前 project 编码,一般 pycharm 新建工程默认都是 utf8
-
-
结论:
-
被打开的文件如果在项目中新建,那么一定是 utf8 编码,可以查看字节数确定
-
被打开文件内容读取到内存中时一定要先 decode 为 unicode
-
如果不指定被打开文件中的 bytes 是何种编码规则那么 windows 系统默认会采用 gbk
-
就是说我们有一段 utf8编码规则的 bytes 正在被 gbk规则进行 decode ,所以会报错
-
-
解决:指定 encoding="utf8"
02 write模式
f = open("***", "写模式", endcoding="编码位")
-
w 写模式:
-
此时写入的内容必须是 str 类
-
之前讨论过 写入硬盘时必须是 bytes 类型,所以要将 unicode 进行 encoding
-
基于当前项目默认编码,在 w 之前要设置 encoding 为 utf8
-
-
wb 写模式:
-
此时写入的内容必采是 bytes 类
-
此时一定不要设置 encoding 因为,在写入之前已经将 str encode 过
-
-