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个字节
posted on 2024-04-09 19:34  晓雾-Mist  阅读(2)  评论(0编辑  收藏  举报