Day 08 字符编码和文件处理
今日内容
- 字符编码
- 文件处理
字符编码
引入
字符串类型、文本文件的内容都是由字符组成的,但凡涉及到字符的存取,都需要考虑字符编码的问题。
字符编码表
规定了人类的字符与数字之间的对应关系
发展史
-
一家独大
现代计算机起源于美国,所以最先考虑仅仅是让计算机识别英文字符,于是诞生了ASCII表
记录了英文与数字的对应关系
1 bytes 来表示所有的英文及符号
8bit 256
-
群雄割据
中国:
中国人为了计算机能够识别中文发明了GBK码
GBK码表
记录了中文、英文与数字的对应关系
2bytes来表示中文及符号
16bit 65535
生僻字可能会使用更多的bytes来表示日本
日本人为了计算机能识别日文发明了shift_JIS码
shift_JIS码表
记录了日文、英文与数字的对应关系韩国
韩国人为了计算机能识别韩文发明了Euc_kr码
Euc_kr码表
记录了韩文、英文与 所有的英文及符号 -
一家独大
为了数据交互通畅,于1994年推出了unicode,也称万国码
英文字符--->unciode格式的数字--->ASCII格式的数字
中文字符、英文字符--->unicode格式的数字--->gbk格式的数字
日文字符、英文字符--->unicode格式的数字--->shift-JIS格式的数字
utf-8
理论上是可以将内存中unicode格式的二进制直接存放于硬盘中的,但由于unicode固定使用两个字节来存储一个字符,如果多国字符中包含大量的英文字符时,使用unicode格式存放会额外占用一倍空间(英文字符其实只需要用一个字节存放即可),然而空间占用并不是最致命的问题,最致命地是当我们由内存写入硬盘时会额外耗费一倍的时间,所以将内存中的unicode二进制写入硬盘或者基于网络传输时必须将其转换成一种精简的格式,这种格式即utf-8(全称Unicode Transformation Format,即unicode的转换格式)
内存使用的编码表是unicode 硬盘使用的是utf8
文本文件编码统一使用utf-8
实际应用
解决文件乱码
文件以什么编码存的就以什么编码取
解码与编码
编码 encode
将人类的字符按照指定的编码转换成计算机能够识别的数据
eg.
x = '你好'
print(x)
>>>你好
res=x.encode('utf-8')
print(res, type(res))
>>>b'\xe4\xbd\xa0\xe5\xa5\xbd' <class 'bytes'>
python2中需要在字符串类型前加u
解码 code
将人类的字符按照指定的编码转换成计算机能够识别的数据
eg.
# res看上个示例
res1=res.decode('utf-8')
print(res1, type(res1))
>>>你好 <class 'str'>
文件处理
基本流程
# 1. 打开文件a.txt,由应用程序向操作系统发起系统调用open(...),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f
f=open(r'a.txt','r',encoding='utf-8')
# 2. 调用文件对象下的读/写方法,会被操作系统转换为读/写硬盘的操作
data=f.read()
print(data) # 读出啊a.txt里的内容
# 3. 向操作系统发起关闭文件的请求,回收系统资源
f.close()
r’a.txt中的r:
r 取消转义,涉及到路径都会用到
补充:
绝对路径
非常详细的路径描述,无论什么人什么位置都可以找到
如果文件的路径比较复杂,可用
相对路径
有一个参考,只有对应的人才可以找到
如果文件和操作系统属同一文件夹可用
文件打开的正确操作
格式: with open(文件路径,读写模式,编码格式) as 变量名:
子代码块
打开a.txt 使用变量名f指代改文件
with open(r'a.txt','r',encoding='utf8') as f:
print(f.read()) # 读取文件内容
with子代码运行结束之后会自动调用close关闭文件资源
# """
# 文件路径是必须的
# 读写模式和编码格式是可选的
# 如果不指定读写模式 那么默认使用r
# 如果不指定编码格式 那么默认使用当前计算机内部默认编码
# 在中国所有的windows电脑内部默认的编码是gbk
# """

浙公网安备 33010602011771号