x 模式
只写模式,不可读,不存在则创建文件,文件存在报错
with open('c.txt',mode = 'x',encoding = 'utf-8') as f:
f.write('aaa')
相当于加了一个判断,看文件是否存在,比较鸡肋
-
Windows平台换行符
mac平台Linux平台换行符: 不同平台存在差异,但是python3解决了这个问题,写 就可以了
控制文件读写内容的模式
t模式
- 读写都是以字符(Unicode)为单位
- 只能针对文本文件
- 必须指定字符编码
对于非文本文件,使用open()打开,不指定encoding,如不进行.read()操作,不会报错,因为在read功能下才会把Unicode解码成utf。
b模式
with open('path','rb') as f:
res = f.read()
print(res,type(res))
# 得到一个bytes类型,一堆二进制
-
读写都是以bytes为单位
-
可以对所有单位进行操作
-
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模式中,依然是以 为分隔符分为一行行,供循环使用
-
两种循环方式: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() :获取相对于文件开头,当前指针位置