缓存机制,深浅copy,编码的进阶,以及文件操作
1.缓存机制,深浅copy,编码的进阶,以及文件操作
1.id,is,==
- id:记录该数据指向的内存地址
- is:判断两个变量是否指向同个值,指向的内存地址相同,值肯定相同。值相同,内存地址不一定相同。
- ==:判断数值是否相同
2.代码块:文件,交互式命令,模块,函数都是一个代码块。
- 缓存机制:
- 同一个代码块内:
- 机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。
- 适用对象:不可变的数据类型(tuple,int,float,bool)
- int(float):任何数字在同一代码块下都会复用。
- bool: True和False在字典中会以1,0方式存在,并且复用。
- str:几乎所有的字符串都会符合缓存机制
2.不同代码块的缓存机制,驻留机制(小数据池)
- 机制内容:在内存中开辟两个空间,一个空间存储-5~256的int,一个空间存储一定规则的字符串,如果你的代码中遇到了满足条件的数据,直接引用提前创建的。
- 使用对象:
- int(folat)
- str
- 字符串的长度为0或者1,默认都采用了驻留机制(小数据池)。
- 字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留。
- 乘法得到的字符串(仅含大小写字母,数字,下划线,默认驻留)
- tuple
- bool
2.深浅copy:复制
1.浅copy:在内存中开辟一个新的空间存放copy的对象(列表,字典),但是里面的所有元素与被copy对象的里面的元素共用一个。
- 外壳不同,里面的元素相同。
- 列表中改值是改变元素位置对应的值 而内存中的字符串是不可变的数据类型 如果嵌套是列表可改变的数据的类型的话都会随之改变的
- 嵌套的可变的数据类型是同一个。
2.深copy:列表是在内存中重新创建的,列表中可变的数据类型是重新创建的,列表中的不可变的数据类型是公用的。
-
不可变的数据类型沿用之前的,可变的数据类型创建新的.
2.嵌套的可变的数据类型不是同一个
-
深copy的特性就是将可变的数据类型在内存中重新创建一一份,
而不可变的数据类型则沿用之前的。
3.编码进阶:
- ASCII码:包含英文字母,数字,特殊字符与01010101对应关系。
- a 01000001 一个字符一个字节表示
- GBK:只包含本国文字(以及英文字母,数字,特殊字符)与0101010对应关系。
- a 01000001 ascii码中的字符:一个字符一个字节表示。
- 中 01001001 01000010 中文:一个字符两个字节表示。
- Unicode:包含全世界所有的文字与二进制0101001的对应关系。
- UTF-8:包含全世界所有的文字与二进制0101001的对应关系(最少用8位一个字节表示一个字符)。
-
a 01000001 ascii 码中的字符:一个字符一个字节表示。
-
To 01000001 01000010 (欧洲文字:葡萄牙,西班牙等)一个字符两个字节表示。
-
3.中 01001001 01000010 01100011 亚洲文字;一个字符三个字节表示。
-
不同的密码本之间不能否互相识别。
-
数据在内存中全部是以Unicode编码的,但是当你的数据用于网络传输或者存储到硬盘中,必须是以非Unicode编码(utf-8,gbk等等)。
-
str: 'hello '
内存中的编码方式: Unicode
表现形式: 'hello'
bytes :
内存中的编码方式: 非Unicode
表现形式:b'hello'
2.中文:
str:
内存中的编码方式: Unicode
表现形式:'中国'
bytes :
内存中的编码方式: 非Unicode # Utf-8
表现形式:b'\xe4\xb8\xad\xe5\x9b\xbd'
-
-
decode:解码,encode:编码
- 比如Unicode转换成非Unicode再转换成gbk编码
a = 'klex' s1 = a.encode('utf-8')#以utf-8方式编码 s2 = s1.decode('utf-8') s3 = s2.encode('gbk')
4.文件操作
计算机系统分为:计算机硬件,操作系统,应用程序三部分。
我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。
1.文件操作条件:
- 文件路径
- 编码方式:utf-8,gbk,gb2312
- 操作模式:r,w,a
- 关闭文件句柄
2.源码解释
open 内置函数,open底层调用的是操作系统的接口。
f1,变量,f1,fh,file_handler,f_h,文件句柄。 对文件进行的任何操作,都得通过文件句柄. 的方式。
encoding:可以不写,不写参数,默认编码本:操作系统的默认的编码
windows: gbk。
linux: utf-8.
mac : utf-8.
f1.close() 关闭文件句柄。
3.文件操作的三部曲:
- 打开文件。
- 对文件句柄进行相应操作。
- 关闭文件
4.路径问题
1.fileNotFoundError:找不到该文件
2.truncated \UXXXXXXXX escape:路径分隔符产生的问题
3.UnicodeDecodeError:打开文件的编码与文件存储时的编码用的编码本不一致导致的.
4.解决方法:
1.凡是路径会发生化学反应的地方,多加一个\ 这样就是前面\对后面的\进行转译,告诉计算机这个只是想单纯的表示\路径而已。
2. r'C:\\Users\lopper\Desktop\\111.txt' 在路径的整体前面加一个r。
5.文件操作:读
-
r模式:读
- 以只读方式打开文件,文件的指针将会放在文件的开头。是文件操作最常用的模式,也是默认模式,如果一个文件不设置mode,那么默认使用r模式操作文件。
- read() #全部读出来
f = open(r'C:\Users\lopper\Desktop\111.txt',encode='utf-8',mode="r") f1 = f.read f.close print(f1)#123456789 #123456789 #123456789 #123456789 3. read(n)#按字符读取
f = open(r'C:\Users\lopper\Desktop\111.txt',encode='utf-8',mode="r") f2 = f.read(3) f.close print(f2) #123- readline()每次只读取一行,末尾自带\n换行符。使用strip:默认去除空格以及换行符
f = open(r'C:\Users\lopper\Desktop\111.txt',encode='utf-8',mode="r") f3 = f.readline().strip f.close pirnt(f3) pirnt(f3) 123456789 123456789- readlines():返回一个列表,列表里面每个元素是原文件的每一行,如果文件很大,占内存,容易崩。
f = open(r'C:\Users\lopper\Desktop\111.txt',encode='utf-8',mode="r") f4 = f.readlines() f.close print(f4) ['123456789\n','123456789\n']- for循环查看:文件句柄是一个迭代器,他的特点就是每次循环只在内存中占一行的数据,非常节省内存。
f = open('../path1/弟子规',mode='r',encoding='utf-8')for line in f: print(line) #这种方式就是在一行一行的进行读取,它就执行了下边的功能print(f.readline())print(f.readline())print(f.readline())print(f.readline())f.close()- rb:读写模式(以二进制字节读取)
f1 = open(r'C:\Users\zunquan\PycharmProjects\递归\文件操作\美女.jpg',mode='rb')f2 = f1.read()f1.close()print(f2)
6.文件操作:写(主要四种模式:w,wb,w+,w+b)
-
w模式
- 如果文件不存在,会创建文件并写入内容
- 如果文件存在,会清空文件并写入内容
f1 = open('t1.txt',encoding='utf-8',mode='w')f1.write('您好')f1.close()f1 = open('t1.txt',encoding='utf-8',mode='w')f1.write('hello')f1.close() -
wb模式
wb模式:以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如:图片,音频,视频等。
# wbf = open('美女.jpg',mode='rb')content = f.read()print(content)f.close()#f1 = open('美女2.jpg',mode='wb')f1.write(content)f1.close()
7.文件操作:追加(a,ab,a+,a+b)
-
a模式
#没有文件创建文件,追加内容f = open(r't1.txt',encoding='utf-8',mode='a')f1 = f.write('我们,你好')#我们,你好f.close()#有文件则追加内容f = open(r't1.txt',encoding='utf-8',mode='a')f1 = f.write('hello')#我们,你好hellof.close()
8.文件操作的其他模式
#1. 打开文件的模式有(默认为文本模式):r ,只读模式[默认模式,文件必须存在,不存在则抛出异常]w,只写模式[不可读;不存在则创建;存在则清空内容]a, 只追加写模式[不可读;不存在则创建;存在则只追加内容]#2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)rb wbab注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码#3,‘+’模式(就是增加了一个功能)r+, 读写[可读,可写]w+,写读[可写,可读]a+, 写读[可写,可读]#4,以bytes类型操作的读写,写读,写读模式r+b, 读写[可读,可写]w+b,写读[可写,可读]a+b, 写读[可写,可读]
- r+模式 (先读后写,如果直接读,打开文件光标默认文件的最开始,要是先写,则写入的内容会讲原内容覆盖掉,直到覆盖到你写完的内容,然后在后面开始读取。)#如果文件内容字节对不上会出乱码的现象。
# 读并追加 # 顺序不能错误。f = open('文件的读写', encoding='utf-8', mode='r+')content = f.read()print(content)f.write('人的一切痛苦,本质都是对自己无能的愤怒。')f.close()#错误示例:f = open('文件的读写', encoding='utf-8', mode='r+')f.write('人的一切痛苦,,,本质都是对自己无能的愤怒,,,')content = f.read()print(content)f.close()
9.文件操作的其他功能:
-
三个大方向:
读,四种模式: r rb r+ r+b
写,四种模式 : w,wb, w+,w+b
追加 四种模式: a, ab, a+,a+b
相应的功能:对文件句柄的操作:read read(n) readline() readlines() write()
-
read(n)
- 文件打开方式为文本模式时,代表读取n个字符
- 文件打开方式为b模式时,代表读取n个字节
-
seek:调整光标
-
seek(n)光标移动到n位置:移动单位是byte,gbk编码中文为2字节,UTF-8为3字节:
-
移动到开头:seek(0)
-
移动到结尾:seek(0,2),seek第二参数表示的是从哪个位置进行偏移:默认0,表示开头,1表示当前位置。2表示结尾。
f = open(r't1.txt',endcoding='utf-8',mode='r+')f1.seek(0)f1 = f.read()print(f1)#全读f.close####f = open(r't1.txt',endcoding='utf-8',mode='r+')f1.seek(0,2)f1 = f.read()print(f1) #读取内容为空close
-
-
tell:查看目前光标在什么位置(字节)
f = open(r't1.txt',endcoding='utf-8',mode='r+')f.seek(0)print(f.till())#0###f = open(r't1.txt',endcoding='utf-8',mode='r+')f.seek(0)f.wirth('嘀嘀嘀')#utf-8一个中文占用3个字节print(f.tell()) #9f.flush()f.close -
flush:强制保存
f = open(r't1.txt',endcoding='utf-8',mode='r+')f.wirth('11111')f.flush()f.close
10.文件打开的另一种方式:
-
with上下文管理这种方式,它会自动关闭文件句柄.
-
with 语句可以操作多个文件,产生多个文件句柄。
with open(r't1.txt', mode='r') as f1, \ open(r't3.txt', mode='w') as f2: print(f1.read()) f2.write('feqewqfeqew')
11.文件的操作的改:
-
文件操作改的流程:
-
以读的模式打开原文件
-
以写的模式创建一个新文件。
-
将原文件的内容读出来修改成新内容,写入新文件。
-
将原文件删除。
-
将新文件重命名成原文件。
import os with open(r'自述',encoding='utf-8')as f1,\ open(r'自述.bak',encoding='utf-8',mode='w')as f2: for i in f1: old = i.strip new = old.replace('hello','word') f2.write(new)os.remove('自述')os.rename('自述.bak','自述')
-

浙公网安备 33010602011771号