疫情环境下的网络学习笔记 python 3.16

x 模式

只写模式,不可读,不存在则创建文件,文件存在报错

with open('c.txt',mode = 'x',encoding = 'utf-8') as f:
	f.write('aaa')

相当于加了一个判断,看文件是否存在,比较鸡肋

  • Windows平台换行符 \r\n :早期计算机使用硬盘,让机器手臂换到下一行,再回到行首

    mac平台Linux平台换行符:\n 不同平台存在差异,但是python3解决了这个问题,写\n 就可以了

控制文件读写内容的模式

t模式

  1. 读写都是以字符(Unicode)为单位
  2. 只能针对文本文件
  3. 必须指定字符编码

对于非文本文件,使用open()打开,不指定encoding,如不进行.read()操作,不会报错,因为在read功能下才会把Unicode解码成utf。

b模式

with open('path','rb') as f:
	res = f.read()
	print(res,type(res))
# 得到一个bytes类型,一堆二进制
  1. 读写都是以bytes为单位

  2. 可以对所有单位进行操作

  3. b模式一定不能指定模式,指定了就报错

    硬盘里是什么,read就得到什么,是什么格式二进制,就得到什么二进制,不解码

    python解释器会把二进制转换成十六进制,英文二进制转成英文显示,想在python中显示别的格式,用 .decode() 方法

    • 在b模式对文本文件进行读,写操作,要指定编码格式手动编码,解码

    • 若直接用字符串(Unicode)写,直接报错:应该用bytes格式写

      with open('path','rb') as f:
      	f.write('你好'.encode('gbk'))
      
    • 用decode之后就相当于用 t 模式

总结:t 模式帮我们自动帮我们完成了编码和解码的环节,但是只针对文本模式。b 模式可以打开所有文件

改写:文件拷贝工具

  • 以rb模式打开源文件,wb模式打开新文件

    open(r'{}','rb') as f,open(r'{}',wb) as g:
    	for line in f:
    		g.write(f)
    

    在b模式中,依然是以\n为分隔符分为一行行,供循环使用

  • 两种循环方式:for line,while + read(n)

f.read(n)

  • f.read(n) 指定读取的字节个数,f.read(1024),一次读1024个字节
  • 当文件一行内容过长,for循环一次占用很多内存,应该使用while循环 + f.read(n) 方法读,该种方法不受一行长度的影响,可以指定每次读取字节的长度

读的其他方法

f.readline()

一次读一行,读完一行光标在一行末尾。不存在读文件过大造成内存占用问题

用 while True + readline() 相当于 for line + read()

f.readlines()

从当前位置起始,往后读出所有的行,每一行作为一个元素存进列表,返回一个大列表。与f.read() 一样,读的内容过大的时候会造成内存占用过多

写的其他方法

f.writelines([list])

相当于for循环一个列表,把每个元素写进f,不自动换行,与 .readlines() 相对应,但是不换行

  • t模式下,入参列表中每一个元素必须是str,否则报错
  • 对于不是英文的字符,在b模式下要用 .encode('utf-8') 编码成bytes再write,对于纯英文字符,直接在字符串前加 b就是一个bytes类型了
  • str.encode('utf-8') 等同于 b = bytes(str,encoding = 'utf-8'),是bytes类型的转换方法

f.flush

在进行一次写操作时,操作系统不会对每一次操作都马上执行,而是攒够了一定的数据量、指令量才会操作,是操作系统的一种优化

f.flush():强制执行操作,不进行等待

其他方法

f.readable()
f.writable()
...

控制文件指针的移动

指针移动的单位都是以bytes(字节)为单位,只有在 t 模式下的 .read(n)特殊,n代表的是字符个数

with open('aaa.txt','rt',encoding ='utf-8') as f:
	res = f.read(4)
	print(res)

f.seek(n,mode)

移动指针,n指的是移动的字节(bytes)个数

模式

  • 0:参照物是文件开头位置

    f.seek(9,0) 移动到整个文件的第九个字节位置

  • 1:参照物是当前指针所在位置移动,可以正向,也可以负向移

    f.seek(3,1) 以当前位置开始,往后移动3个字节

  • 2:参照物是文件末尾位置,因为末尾后面没有字节,应该倒着移动指针

只有 0 模式可以在t 下使用,1 和 2 模式都要在b 模式下使用,使用则报错

使用seek 移动指针的时候,可以一个个字节移动,但是如果移动到中文字符三个字节的中间,再进行解码读写操作,则报错

f.tell() :获取相对于文件开头,当前指针位置

posted @ 2020-03-16 14:30  黑猫警长紧张  阅读(208)  评论(0)    收藏  举报