缓存机制,深浅copy,编码的进阶,以及文件操作

1.缓存机制,深浅copy,编码的进阶,以及文件操作

1.id,is,==

  1. id:记录该数据指向的内存地址
    1. is:判断两个变量是否指向同个值,指向的内存地址相同,值肯定相同。值相同,内存地址不一定相同。
    2. ==:判断数值是否相同

2.代码块:文件,交互式命令,模块,函数都是一个代码块。

  1. 缓存机制:
    1. 同一个代码块内:
    2. 机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。
    3. 适用对象:不可变的数据类型(tuple,int,float,bool)
      1. int(float):任何数字在同一代码块下都会复用。
      2. bool: True和False在字典中会以1,0方式存在,并且复用。
      3. str:几乎所有的字符串都会符合缓存机制

2.不同代码块的缓存机制,驻留机制(小数据池)

  1. 机制内容:在内存中开辟两个空间,一个空间存储-5~256的int,一个空间存储一定规则的字符串,如果你的代码中遇到了满足条件的数据,直接引用提前创建的。
  2. 使用对象:
    1. int(folat)
    2. str
      1. 字符串的长度为0或者1,默认都采用了驻留机制(小数据池)。
      2. 字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留。
      3. 乘法得到的字符串(仅含大小写字母,数字,下划线,默认驻留)
    3. tuple
    4. bool

2.深浅copy:复制

1.浅copy:在内存中开辟一个新的空间存放copy的对象(列表,字典),但是里面的所有元素与被copy对象的里面的元素共用一个。

  1. 外壳不同,里面的元素相同。
  2. 列表中改值是改变元素位置对应的值 而内存中的字符串是不可变的数据类型 如果嵌套是列表可改变的数据的类型的话都会随之改变的
  3. 嵌套的可变的数据类型是同一个。

2.深copy:列表是在内存中重新创建的,列表中可变的数据类型是重新创建的,列表中的不可变的数据类型是公用的。

  1. 不可变的数据类型沿用之前的,可变的数据类型创建新的.

    2.嵌套的可变的数据类型不是同一个

  2. 深copy的特性就是将可变的数据类型在内存中重新创建一一份,
    而不可变的数据类型则沿用之前的。

3.编码进阶:

  1. ASCII码:包含英文字母,数字,特殊字符与01010101对应关系。
    1. a 01000001 一个字符一个字节表示
  2. GBK:只包含本国文字(以及英文字母,数字,特殊字符)与0101010对应关系。
    1. a 01000001 ascii码中的字符:一个字符一个字节表示。
    2. 中 01001001 01000010 中文:一个字符两个字节表示。
  3. Unicode:包含全世界所有的文字与二进制0101001的对应关系。
  4. UTF-8:包含全世界所有的文字与二进制0101001的对应关系(最少用8位一个字节表示一个字符)。
    1. a 01000001 ascii 码中的字符:一个字符一个字节表示。

    2. To 01000001 01000010 (欧洲文字:葡萄牙,西班牙等)一个字符两个字节表示。

   3.中 01001001 01000010 01100011 亚洲文字;一个字符三个字节表示。

  1. 不同的密码本之间不能否互相识别。

  2. 数据在内存中全部是以Unicode编码的,但是当你的数据用于网络传输或者存储到硬盘中,必须是以非Unicode编码(utf-8,gbk等等)。

    1. str: 'hello '

      ​ 内存中的编码方式: Unicode

      ​ 表现形式: 'hello'

      bytes :

      ​ 内存中的编码方式: 非Unicode

      ​ 表现形式:b'hello'

    ​ 2.中文:

    ​ str:

    ​ 内存中的编码方式: Unicode

    ​ 表现形式:'中国'

    ​ bytes :

    ​ 内存中的编码方式: 非Unicode # Utf-8

    ​ 表现形式:b'\xe4\xb8\xad\xe5\x9b\xbd'

  3. decode:解码,encode:编码

    1. 比如Unicode转换成非Unicode再转换成gbk编码
    a = 'klex'
    s1 = a.encode('utf-8')#以utf-8方式编码
    s2 = s1.decode('utf-8')
    s3 = s2.encode('gbk')
    

4.文件操作

计算机系统分为:计算机硬件,操作系统,应用程序三部分。

我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。

1.文件操作条件:

  1. 文件路径
  2. 编码方式:utf-8,gbk,gb2312
  3. 操作模式:r,w,a
  4. 关闭文件句柄

2.源码解释

open 内置函数,open底层调用的是操作系统的接口。
f1,变量,f1,fh,file_handler,f_h,文件句柄。 对文件进行的任何操作,都得通过文件句柄. 的方式。
encoding:可以不写,不写参数,默认编码本:操作系统的默认的编码
windows: gbk。
linux: utf-8.
mac : utf-8.
f1.close() 关闭文件句柄。

3.文件操作的三部曲:

  1. 打开文件。
  2. 对文件句柄进行相应操作。
  3. 关闭文件

4.路径问题

1.fileNotFoundError:找不到该文件
2.truncated \UXXXXXXXX escape:路径分隔符产生的问题
3.UnicodeDecodeError:打开文件的编码与文件存储时的编码用的编码本不一致导致的.
4.解决方法:
	1.凡是路径会发生化学反应的地方,多加一个\ 这样就是前面\对后面的\进行转译,告诉计算机这个只是想单纯的表示\路径而已。
	2. r'C:\\Users\lopper\Desktop\\111.txt' 在路径的整体前面加一个r。

5.文件操作:读

  1. r模式:读

    1. 以只读方式打开文件,文件的指针将会放在文件的开头。是文件操作最常用的模式,也是默认模式,如果一个文件不设置mode,那么默认使用r模式操作文件。
    2. 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
    
    1. 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
    
    1. 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']
    
    1. 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()
    
    1. rb:读写模式(以二进制字节读取)
    f1 = open(r'C:\Users\zunquan\PycharmProjects\递归\文件操作\美女.jpg',mode='rb')f2 = f1.read()f1.close()print(f2)
    

6.文件操作:写(主要四种模式:w,wb,w+,w+b)

  1. w模式

    1. 如果文件不存在,会创建文件并写入内容
    2. 如果文件存在,会清空文件并写入内容
    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()
    
  2. 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)

  1. 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, 写读[可写,可读]
  1. 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.文件操作的其他功能:

  1. 三个大方向:

    读,四种模式: r rb r+ r+b

    写,四种模式 : w,wb, w+,w+b

    追加 四种模式: a, ab, a+,a+b

    相应的功能:对文件句柄的操作:read read(n) readline() readlines() write()

  2. read(n)

    1. 文件打开方式为文本模式时,代表读取n个字符
    2. 文件打开方式为b模式时,代表读取n个字节
  3. seek:调整光标

    1. seek(n)光标移动到n位置:移动单位是byte,gbk编码中文为2字节,UTF-8为3字节:

    2. 移动到开头:seek(0)

    3. 移动到结尾: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
      
  4. 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
    
  5. flush:强制保存

    f = open(r't1.txt',endcoding='utf-8',mode='r+')f.wirth('11111')f.flush()f.close
    

10.文件打开的另一种方式:

  1. with上下文管理这种方式,它会自动关闭文件句柄.

  2. 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.文件的操作的改:

  • 文件操作改的流程:

    1. 以读的模式打开原文件

    2. 以写的模式创建一个新文件。

    3. 将原文件的内容读出来修改成新内容,写入新文件。

    4. 将原文件删除。

    5. 将新文件重命名成原文件。

      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','自述')
      
posted @ 2021-12-05 10:24  啊铨的博客  阅读(128)  评论(0)    收藏  举报