6.文本处理
【一】深浅拷贝
1)浅拷贝
-
复制对象的一层内容,若包含可变数据,则拷贝对象与原对象共享这些可变数据类型的引用
-
即原对象中的可变数据类型进行修改操作时,拷贝的对象也会受到影响。
import copy # 原对象 count = [1, [3, 4]] # 浅拷贝 count_1 = copy.copy(count) count.append(2) print(count) # [1, [3, 4], 2] print(count_1) # [1, [3, 4]] count[1].append(5) print(count) # [1, [3, 4, 5], 2] print(count_1) # [1, [3, 4, 5]]
2)深拷贝
-
创建一个完全独立的新对象,包括所有嵌套对象
-
对于原对象的修改不会印象深拷贝的对象
import copy # 原对象 count = [1, [3, 4]] # 浅拷贝 count_1 = copy.deepcopy(count) count.append(2) print(count) # [1, [3, 4], 2] count[1].append(5) print(count) # [1, [3, 4, 5], 2] print(count_1) # [1, [3, 4]]
【二】垃圾回收机制
- 又称GC机制,是python解释器自带的一种机制
- 专门回收不可用的变量所占的内存空间
1)堆、栈的概念
- 栈区:变量名和值内存地址关联的区域
- 堆区:变量值存放的区域
【三】垃圾回收机制原理
- 引用计数为主,标记清除,分代回收为辅
1)引用计数
- 变量值被变量名指定的次数
2)标记清除
-
当一个变量值被引用的时候,Python自带的垃圾回收机制会定期扫描
-
若此变量值被引用,则不管
-
若此变量值未引用,则标记
3)分代回收
- 新生代(young generation):
- 包含了大部分新创建的对象,其存活时间较短。
- 青春代(youth generation):
- 包含了已经经历过垃圾回收一次的新生代对象,存活时间较长。
- 老年代(old generation):
- 包含了已经经历过多次垃圾回收的对象,存活时间较长。
【四】小整数池
- 小整数池的范围是[-5,256]
- python对这些数值已经提前创建好了内存空间,即使多次重新定义也不会在重新开辟新的空间,其内存id不会改变
【五】字符编码
1)数据存放位置
-
软件启动前数据存放于磁盘中
-
软件启动后数据从磁盘中写入内存,cpu从内存中取出指令并执行
2)字符编码概念
- 计算机只能识别二进制,字符编码指将人类的字符转义成二进制
3)发展史
1.一家独大(ASCII)
- 只有英文字符与数字的对应关系
- A-Z : 65-90
- a-z : 97-122
- 0-9 : 48-57
2.诸侯割据(ASCII/GBK/Shift_JIS)
- 各国有着不同的编码表
- 中国:GBK
- 日本:Shift_JIS
3.一统天下(unicode)
- 兼容万国字符
- 美国人--ascii ---> unicode ----> GBK ---> 中文
4)编码与解码
1.编码(.encode())
name = '晓雾'
print(name.encode('utf8'))
# b'\xe6\x99\x93\xe9\x9b\xbe'
2.解码(.decode())
name = b'\xe6\x99\x93\xe9\x9b\xbe'
print(name.decode('utf8'))
# 晓雾
5)utf-8的诞生
-
多国字符—√—>内存(unicode格式的二进制)—√—>硬盘(utf-8格式的二进制)
-
utf8mb4可以存储表情
【六】文本处理
1)文件操作的基本流程
1.open语句
- 需手动关闭
f = open('0.text', 'r', encoding='utf-8')
data = f.read()
f.close()
2.with open语句
- 会自动关闭
with open('0.text', 'r', encoding='utf8') as f:
data = f.read()
2)文件的操作模式
1.读模式(r)
- 文件不存在会报错
- 指针跳到开头
with open('0.text', 'r', encoding='utf8') as f:
data = f.read()
print(data)
# 文件内的所有内容
2.覆盖写模式(w)
- 文件不存在会创建出来
- 文件存在会清空文件里的内容
- 可连续写入
with open('0.text', 'w', encoding='utf8') as f:
f.write(内容)
3.追加写模式(a)
- 文件不存在会创建出来
- 文件存在指针跳到结尾继续写入
with open('0.text', 'a', encoding='utf8') as f:
f.write(内容)
4.+模式(可读可写)
- r+, w+ ,a+ :可读可写
5.b模式(二进制模式)
- wb,rb
- 读写文件都是以bytes/二进制为单位的
- 可针对所有文件,不要指定参数
3)文件的操作方式
1.读模式
- f.read()
- 读取所有内容,执行完该操作后,文件指针会移动到文件末尾
- f.readline()
- 读取一行内容,光标移动到第二行首部
- f.readlines()
- 读取每一行内容,存放于列表中
2.写模式
- f.write()
- 一次性全部写入
- f.writelines()
- 逐个元素进行写入
3.判断文件
f.readable() #文件是否可读
f.writable() #文件是否可读
f.closed #文件是否关闭
f.encoding #如果文件打开模式为b,则没有该属性
f.flush() #立刻将文件内容从内存刷到硬盘
f.name() #获取文件的名字
4)主动控制文件内指针移动
1.read方法
with open('0.text', 'r', encoding='utf8') as f:
data = f.read(参数)
print(data)
# 文件内参数之后的内容
2.seek移动指针
- 模式0
- 以开头作为参照移动
- 模式1
- 以当前位置作为参照移动
- 模式2
- 以末尾作为参照移动
with open('0.text', 'r', encoding='utf8') as f:
f.seek(_,0)
data = f.read(参数)
print(data)
- 字母 数字占一个字节,汉字占3个字节