pycharm默认为gbk编码_6-字符编码-⽂件处理
1、字符编码
1、什么是字符编码
⼈类在于计算机交互时,⽤的都是⼈类能读懂的字符,如:中⽂字符,英⽂字符,⽇⽂字符的等,⽽计算机只能识别⼆进制数,详解如下:(进制数即由0和1组成的由⼈类字符到计算机中的数字,必须经历⼀个过程,如下:字符----->翻译------>数字
翻译的过程必须参照⼀个特定的标准,该标准为字符编码表,该表上存放的就是字符与数字⼀⼀对应的关系。编码即将字符编译转换成计算机能识别的数字。
2、字符编码表的发展史
(1)阶段⼀:⼀家独⼤
# ASCII表的特点:现代计算机起源于美国,所以最先考虑仅仅是让计算机识别英⽂字符,于是诞⽣了ASCII表、
1、只有英⽂字符与数字的⼀⼀对应关系
2、⼀个英⽂字符对应1Bytes,1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,⾜够表⽰所有英⽂字符。
(2)阶段⼆:诸侯割据、天下⼤乱
# GBK表的特点:
1、只有中⽂字符、英⽂字符与数字的⼀⼀对应关系
2、⼀个英⽂字符对应1Bytes、⼀个中⽂字符对应2Bytes
#补充说明:
1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,⾜够表⽰所有英⽂字符
2Bytes=16bit,16bit最多包含65536个数字,可以对应65536个字符,⾜够表⽰所有中⽂字符
#Shift_JIS表的特点: 1、只有⽇⽂字符、英⽂字符与数字的⼀⼀对应关系
# Euc-kr表的特点:1、只有韩⽂字符、英⽂字符与数字的⼀⼀对应关系
#各种字符编码表的总结:
英⽂字符--->内存(ASCII格式的⼆进制)--->硬盘(ASCII格式的⼆进制)
中、英⽂字符--->内存(GBK格式的⼆进制)--->硬盘(GBK格式的⼆进制)
⽇、英⽂字符--->内存(shift-jis的⼆进制)--->硬盘(shift-jis的⼆进制)
(3)阶段三:分久必合
#unicode于1990年开始研发,1994年正式公布,具备两⼤特点:⽤16bit(2Bytes)对应⼀个字符
1. 存在所有语⾔中的所有字符与数字的⼀⼀对应关系,即兼容万国字符
2. 与传统的字符编码的⼆进制数都有对应关系,详解如下
很多地⽅或⽼的系统、应⽤软件仍会采⽤各种各样传统的编码,这是历史遗留问题。此处需要强调:软件是存放于硬盘的,⽽运⾏软件是要将软件加载到内存的,
⽂本编辑器输⼊任何字符都是最新存在于内存中,是unicode编码的,存放于硬盘中,则可以转换成任意其他编码,只要该编码可以⽀持相应的字符:
英⽂字符--->内存(unciode格式的数字)--->硬盘(ASCII格式的数字)
中⽂字符、英⽂字符--->内存(unicode格式的数字)--->硬盘(gbk格式的数字)
⽇⽂字符、英⽂字符--->内存(unicode格式的数字)--->硬盘(shift-JIS格式的数字)
3、编码与解码
(1)由字符转换成内存中的unicode,以及unicode转换成其他编程的过程,都成为编码encode
(2)由内存中的unicode转换成字符,以及由其他编码转换成unicode的过程,都成为解码decode。
4、utf-8的由来
如果保存到硬盘的是GBK格式的⼆进制,当初⽤户输⼊的字符只能是中⽂或者英⽂,同理如果保存到硬盘的是shift-jis格式⼆进制,当初⽤户输⼊的字符只能是英⽂或(1)多国字符—√—》内存(unicode格式的⼆进制)——X—》硬盘(GBK格式的⼆进制)
(2)多国字符—√—》内存(unicode格式的⼆进制)——X—》硬盘(Shift_JIS格式的⼆进制)
(3)多国字符—√—》内存(unicode格式的⼆进制)——√—》硬盘(格式的⼆进制)
理论上是可以将内存中unicode格式的⼆进制直接存放在硬盘中,但由于unicode固定使⽤两个字节来存储⼀个字符,<1>如果多国字符中包含⼤量的英⽂字符时,使⽤将内存中的unicode⼆进制写⼊硬盘或者基于⽹络传输时必须将其转换成⼀种精简的格式,这种格式即utf-8(全称Unicode Transformation Format,即unicode的转
#万国字符--->内存(unicode格式的⼆进制数)--->硬盘(utf-8格式的⼆进制数)
#那为何在内存中不直接使⽤utf-8呢?
(1)utf-8是针对Unicode的可变长度字符编码:⼀个英⽂字符占1Bytes,⼀个中⽂字符占3Bytes,⽣僻字⽤更多的Bytes存储
(1)utf-8是针对Unicode的可变长度字符编码:⼀个英⽂字符占1Bytes,⼀个中⽂字符占3Bytes,⽣僻字⽤更多的Bytes存储
(2)unicode更像是⼀个过渡版本,我们新开发的软件或⽂件存⼊硬盘都采⽤utf-8格式,等过去⼏⼗年,所有⽼编码的⽂件都淘汰掉之后,会出现⼀个令⼈开⼼的场4、字符编码的应⽤
我们学习字符编码就是为了存取字符时不发⽣乱码问题:
(1)内存中固定使⽤unicode⽆论输⼊任何字符都不会发⽣乱码
(2)我们能够修改的是存/取硬盘的编码⽅式,如果编码设置不正确将会出现乱码问题。乱码问题分为两种:存乱了,读乱了
(3)存乱了:如果⽤户输⼊的内容中包含中⽂和⽇⽂字符,如果单纯以shift_JIS存,⽇⽂可以正常写⼊硬盘,⽽由于中⽂字符在shift_jis中没有到对应关系⽽导致存(4)读乱了:如果硬盘中的数据是shift_JIS格式存储的,采GBK格式读⼊内存就读乱了。#使⽤与解码的存储格式⼀样即可打开
5、python解释器
(1)python解释器执⾏⽂件的流程,以python test.py为例,执⾏流程如下:
1、启动python解释器,此时就相当于启动了⼀个⽂本编辑器
2、python解释器相当于⽂本编辑器,从硬盘上将test.py的内容读⼊到内存中
3、python解释器解释执⾏刚刚读⼊的内存的内容,开始识别python语法
(2)执⾏py⽂件的前两个阶段就是python解释器读⽂本⽂件的过程,与⽂本编辑⽂本⽂件的前两个阶段没有任何区别,如何保证读不乱码?
1、必须将python解释器读⽂件时采⽤的编码⽅式设置为⽂件当初写⼊硬盘时编码格式,如果没有设置,python解释器则使⽤默认的编码⽅式,py3中为utf-8,py-2位
2、在⽂件⾸⾏写⼊包含#号在内的以下内容
fp:#coding:utf-8
#原理:解释器会先⽤默认的编码当时读取⽂件的⾸⾏内容,由于⾸⾏是纯英⽂组成,⽽任何编码⽅式都可以识别英⽂字符。
(3)python解释器执⾏⽂件的第三个阶段
python解释器终端识别内存中的格式:
1、在Python3中,字符串类的值都是使⽤unicode格式来存储
2、由于Python2的盛⾏是早于unicode的,因此在Python2中是按照⽂件头指定的编码来存储字符串类型的值的(如果⽂件头中没有指定编码,那么解释器会按照它
# coding:utf-8
x = '上'  # x的值为untf-8格式的⼆进制
print(x) 打印操作是将x的值,即utf-8格式的⼆进制交给终端,当终端收到后发现并不是unicode(只有unicode才与字符有对应关系),所以终端会执⾏操作:utf-8⼆
# 在windows下的cmd中运⾏效果如下
C:UsersAdministrator>python2 E:aaa.py
(4)字符串encode编码与decode解码的使⽤
# 1、unicode格式------编码encode-------->其它编码格式
>>> x='上' # 在python3在'上'被存成unicode
>>> de('utf-8')
>>> res,type(res) # unicode编码成了utf-8格式,⽽编码的结果为bytes类型,可以当作直接当作⼆进制去使⽤
(b'xe4xb8x8a', <class 'bytes'>)
# 2、其它编码格式------解码decode-------->unicode格式
>>> res.decode('utf-8')
'上'
#总结
python2解释器默认使⽤字符编码是ascii
python3解释器默认使⽤的字符编码是utf-8
python2的str就是python3的bytes
python3的uicode就是python3的str
2、⽂件处理
1、⽂件的打开模式
⼀:控制读写操作模式
r:只读--->默认
python怎么读的
w:只写
a:只追加写
2、控制读写内容的模式
t:读写都是⽂本格式,即读写都是⽤字符串--->默认
b:读写都是bytes格式,bytes等同于⼆进制
#如果是t模式⼀定要加上encoding="编码格式"
如果是b模式⼀定不加encoding="编码格式"
3、案例
3.1 案例1
r:在⽂件存在的时候,⽂件指针调到⽂件开头,⽂件不存在直接报错
f=open("a.txt",mode="rt",encoding='utf-8')
# ad()
# print(res)
f.close()
3.2 案例2
w:在⽂件存在的时候会清空⽂件,⽂件指针调到⽂件开头,⽂件不存在会创建空⽂档    f=open("c.txt",mode="wt",encoding='utf-8')
# f.write("aaaan")
# f.write("bbbbn")
# f.write("ccccn")
f.write("11111n")
f.close()
3.3 案例3
a:在⽂件存在的时候不会清空⽂件,⽂件指针调到⽂件末尾,⽂件不存在会创建空⽂档    f=open("d.txt",mode="at",encoding='utf-8')
f.write("6666666n")
f.write("6666666n")
f.write("6666666n")
f.write("11111n")
f.close()
3.4 案例4:rb wb ab
f=open("a.txt",mode='rb')
ad()
print(res.decode("utf-8"))
f.close()
f=open("D:fullstack16day05视频01 本周内容.mp4",mode='rb')
ad()
print(res)
f.close()
f=open("a.txt",mode='ab')
f.write("你好".encode('utf-8'))
f.close()
with open(r"D:fullstack16day05视频01 本周内容.mp4",mode='rb') as f1,
open(r"D:111111.mp4",mode="wb") as f2:
# ad()
# f2.write(res)
for line in f1:
f2.write(line)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。