Python文件编码怎么理解
这篇文章主要介绍"Python文件编码怎么理解",在日常操作中,相信很多人在Python文件编码怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Python文件编码怎么理解"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
1、代码编码问题
相信很多小伙伴都听说过这样的话,Python3 的默认编码方式是以 UTF-8,听着有点玄幻,啥叫 Python 的默认编码?
当我们编译运行一个py
文件(test.py)的时候,Python 编译器首先会对文件 test.py
进行读取,然后默认对数据进行 UTF-8
的解码,然后编译运行,程序跑了起来。
我们知道,数据的解码和编码都是成对的,且需要采取相同的编码方式,否则解码的数据就会和原数据不一样。其实也类似于 AES 的解密和加密。
试想一下,test.py
文件是由一个文本编辑器以 GBK
的编码方式写入,此时采用默认的 UTF-8
方式进行解码,就会造成乱码情况。
不信的话,show code with you:
# 测试环境:OS: Mac os 10.15IDE: PycharmPython: Python3.8Author: 西园公子
1.1、案例1:
测试脚本 test.py
,脚本文件是以 UTF-8 编码的方式保存的。
内容:
# coding=gbk# Author: zwjjiaozhu# Date: 2021/1/8# IDE: VsCodeimport sysprint(sys.getdefaultencoding())name = '小甲'print(f"name: {name}\n name_type: {type(name)}\n :{repr(name)}")with open('utf.txt', 'w', encoding='utf8') as f: f.write(name)with open('gbk.txt', 'w', encoding='gbk') as f: f.write(name)
结果:
utf-8name: 灏忕敳name_type::'灏忕敳'# 写入文件内容打印(前提:都是以UTF-8的解码方式打开文本)灏忕敳小甲
此时你该困惑了,这都是啥呀?为啥打印显示灏忕敳
。以 GBK
的方式写入文件,却内容显示正常为小甲
,以 UTF-8
的方式写入文件却显示为灏忕敳
。
接下来我来讲明白它:
上面的代码首行添加了 # coding=gbk
,这就告诉编译器需要使用GBK
的解码方式对 test.py
文件进行解码,转成相应的 Unicode
码,然后就运行代码了。
由于name = '小甲'
是中文,所以当使用GBK进行解码,翻译成 Unicode 码值
后,打印显示后就出现了乱码问题(也就是值不对应的问题),其他的代码啥的都是字母,不同的编码解码方式都是可以正常显示的,谁让是美国人发明的呢????
然后是写入文件:
encoding='utf8' ,将编译器解码的 name 的值(灏忕敳)以UTF-8的编码方式写入文件utf.txt中,当使用记事本打开utf.txt文件时,记事本默认是以UTF-8的解码方式打开,就显示
灏忕敳
了。编码和解码成对的,媒介是 UTF-8encoding='gbk' ,同理,将编译器解码name后的Unicode值(灏忕敳对应的Unicode值)以GBK的编码方式写入文件 gbk.tx t中。如果此时采用UTF-8的解码方式打开这个文本,就会显示
小甲
正常,如果采用GBK的方式打开,那不好意思,还是显示灏忕敳
。相当于是 python编译器对 test.py 的 GBK 解码和写入文件的GBK编码抵消,得到的就是最开始的 test.py 以UTF-8编码的数据。
可能你还是不太懂,强烈推荐手动画画草图,这里我画一个流程图,以加深理解~
哇好累呀,肝的我脑疼,总算解释清楚了,
2、字符串编码
在 Python 内部中有两种常见格式,字符串和字节 bytes类型,在网络传输中以及写入文件时,通常是转成bytes。例如:"你好"
和 b"\xe4\xbd\xa0\xe5\xa5\xbd"
(utf-8编码的) ,两者是等价的。
2.1、字符串和字节互转
字节是以 \x
开头后跟16进制数
方式1,使用encode和decode方式直接转
name = "你好"name_bytes = name.encode("utf8") # 用utf8进行编码,用gbk或者ascii都行name2 = name_bytes.decode("utf8") # 同样的必须使用用utf8进行解码,做到编码和解码是对应的,才不会乱码print(f"name:{name},type:{type(name)}")print(f"name_bytes:{name_bytes},type:{type(name_bytes)}")print(f"name2:{name2},type:{type(name2)}")# 结果:# name:你好,type:# name_bytes:b'\xe4\xbd\xa0\xe5\xa5\xbd',type: # name2:你好,type:
方式2,使用 str 和 bytes 转
age = '12'age_bytes = bytes(age, encoding="utf8")age_str = str(age_bytes.decode("utf8"))print(f"age:{age},type:{type(age)}")print(f"age_bytes:{age_bytes},type:{type(age_bytes)}")print(f"age_str:{age_str},type:{type(age_str)}")# 结果:# age:12,type:# age_bytes:b'12',type: # age_str:12,type:
说明:字符串在Python内部也就是内存中是以 Unicode 方式存在,因此,在做编码转换时,通常需要以 Unicode 作为中间编码,即先将其他编码的字符串解码(decode)成 Unicode ,再将unicode编码(encode)成另一种编码。
decode
的作用是将 bytes 字节
解码成 str 类型字符串
,如str1.decode('gb2312'),表示将字符串 str1 以gb2312 的解码
方式解码转换成 str 类型,也就是 Python 的str
类型 。
encode
的作用是将 str 类型字符串
编码转换成 bytes 字节
,如str2.encode('gb2312'),表示字符串 str2 以gb2312 的编码
方式转换成 bytes 类型。因此,转码的时候一定要先搞明白,数据 str1 是什么编码,用什么方式编码的,就用什么方式解码。
到此,关于"Python文件编码怎么理解"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!