python基础09-字符编码
今日学习
- 作业讲解
- 垃圾回收机制(理论)
- 字符编码概述(理论)
- 字符编码相关操作
- 代码操作文件
垃圾回收机制
"""python会自动帮你申请和释放内存空间"""
1.引用计数
当数据值身上的引用计数不为0表示该数据值还有用 不会被删
当数据值身上的引用计数为0则会被垃圾回收机制回收
name = 'jason' # 数据值jason身上的引用计数就是1
name1 = name # 数据值jason身上的引用计数就是2
del name1 # 数据值jason身上的引用计数变为1
'''引用计数存在一个坑>>>:循环引用'''
2.标记清除
专门用于解决循环引用的问题 将内存中程序产生的所有数据值全部检查一遍
是否存在循环引用打上标记 之后一次性清除
# 循环引用
l1 = ['jason', ]
l2 = ['kevin', ]
l1.append(l2) # 引用计数为2
l2.append(l1) # 引用计数为2
del l1 # 解除变量名l1与列表的绑定关系 列表引用计数减一
del l2 # 解除变量名l1与列表的绑定关系 列表引用计数减一
3.分代回收
标记清除每隔一段时间就需要将所有的数据排查一遍 资源消耗过大
为了减轻垃圾回收机制的资源损耗 开发了三代管理
越往下检测的频率越低!!!
字符编码简介
1.只有文本文件才有字符编码的概念
2.计算机内部存取数据的本质>>>:二进制
计算机其实只认识0和1.
3.为什么我们在使用计算机的时候可以随意敲出各国文字
肯定存在一个人类字符与数字的转换关系
4.转换关系不能随便更改 应该有统一的标准
字符编码表>>>:记录了人类的字符与数字的对应关系
字符编码发展史
1.一家独大
计算机是有美国人发明的 美国人需要让计算机识别英文字符
ps:英文所有的字符加起来不超过127个(2的七次方) 但是美国人考虑到后续可能出现新的字符所以加了一位以备不时之需(2的八次方)
ASCII码:内部只记录了英文字符与数字的对应关系
1bytes来存储字符
A-Z 65-90
a-z 97-122
ps:此时的计算机只能识别英文 不识别其他文字
2.群雄割据
中国
需要让计算机识别中文 需要开发一套中文的编码表
GBK码:内部记录了中文字符、英文字符与数字的对应关系
2bytes起步存储中文(遇到生僻字使用更多字节)
1bytes存储英文
韩国
需要让计算机识别韩文 需要开发一套韩文的编码表
Euc_kr码:内部记录了韩文字符、英文字符与数字的对应关系
日本
需要让计算机识别日文 需要开发一套日文的编码表
shift_JIS码:内部记录了日文字符、英文字符与数字的对应关系
ps:此时的各国计算机文本文件无法直接交互 会出现乱码的情况
3.天下一统
万国码(unicode):兼容万国字符
所有的字符全部使用2bytes起步存储
utf家族(针对unicode的优化版本)>>>:utf8
英文还是采用1bytes
其他统一采用3bytes
ps:内存使用unicode 硬盘使用utf8
字符编码实操
"""只有字符串可以参与编码解码 其他数据类型需要先转换成字符串才可以..."""
1.解决乱码的措施
当初以什么编码存的就以什么编码解
2.编码与解码
编码(人类的字符>>>计算机的字符)
将人类的字符按照指定的编码转换成计算机可以识别的数字
解码(计算机的字符>>>人类的字符)
将计算机能够识别的数字按照指定的编码转成人类可以读懂的字符
s1 = 'jason说你们都是大宝贝'
# 编码
res = s1.encode('gbk')
print(res, type(res))
"""
在python中bytes类型的数据可以直接看成是二进制数据
"""
# 解码
res1 = res.decode('gbk')
print(res1)
3.解释器层面
python2默认的编码是ASCII码
1.文件头
# coding:utf8
2.定义字符串
需要在字符串的前面加u
ps:为什么要这么做 因为木有办法 是补救措施
python3默认的编码是utf8码
文件操作简介
1.文件操作?
通过编写代码自动操作文件读写
2.什么是文件?
双击文件图标是从硬盘加载数据到内存
写文件之后保存其实就是将内存中的数据刷到硬盘
文件其实是操作系统暴露给用户操作计算机硬盘的快捷方式之一!!!
3.如何代码操作文件?
open(文件路径,读写模式,字符编码)
方式1
f = open()
f.close()
方式2
with open() as 变量名:
子代码运行结束之后自动调用close()方法
4.针对文件路径需要注意 可能存在特殊含义(字母与撬棍的组合)
在字符串的前面加字母r即可取消特殊含义
例
方式一
res = open('a.txt', 'r', encoding='utf8')
print(res.read()
方式二
------------------# 方式二 with open () as 变量名:-------------------------
with open('a.txt', 'r', encoding='utf8') as file: #file此时为变量名
print(file.read())
#打开具体路径下的文件
with open(r'D:\lzl\test\test.txt', 'r', encoding='utf8') as f:
print(f.read())
#r 取消特殊含义
补充
"编码,如果编码的内容全部是英文或者数字,可以简写"