理解文件中的读取或者写入顺序要先知道对文件进行读写时它的工作模式:在python中对文件进行读写时,是依据文件中光标的位置进行读写的。
这里就要引入seek()方法:
seek(offset, whence)
offset – 开始的偏移量,也就是代表需要移动偏移的字节数
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。(定义参考菜鸟教程)
这是什么意思呢?
例子:
with open('abc.txt', 'r', encoding = 'utf-8') as f
data = f.readline()
print(data)
当我们用‘r’模式打开文件时,文件中的光标默认在第一个字符(注意是第一个字符,而不是第一行字符),当我们读取文件中的字符时,它是按照光标的位置进行读取的,对于
data = f.readline() 来说就是当光标走到第一行字符的换行符时就停止了,并返回光标走过的字符串,在txt文件内每一行字符的末尾会有一个隐藏的换行符’n’。
此时我们对f使用seek()方法:f.seek(), 就可以改变文件内光标的位置了,以达到输出我们需要的字符的目的。
用我的理解来说seek(offset, whence)方法:
第一个参数就是把光标移动到当前的第几个字节(注意是字节,不是字符):
第二个参数就是从哪里开始(就是第一个参数解释的当前):
0代表从文件开头开始算起。
1代表从当前位置开始算起。
2代表从文件末尾算起。
例如:
f.seek(3,0):就是把光标移动到文件的开头的第三个字节处。
f.seek(5,1):就是把光标移动到文件当前位置的第五个字节处。
f.seek(7,2):就是把光标移动到文件末尾的第七个字节处。
但是要注意不同的编码它的每一个字符占有的字节数是不一样的,
对于utf-8编码来说一个汉字占3个字节。
现在来说说对于不同的打开方式,文件光标所处的不同位置:
r:只进行读的操作,需要文件存在,进行读操作时,文件的光标在开头的第一个字节。
r+:即可读也可以写,需要文件存在。文件光标在开头的第一个字节,这里分为两种情况:
第一种:先写后读:
由于文件的光标处于开头第一个字节,这就导致了若原文件中光标的位置存在字符,则会被新写入的字符覆盖,即光标所到的位置如有字符则会被新字符覆盖,若光标所在的位置无字符,则写入新的字符。这里又产生了两种情况:
第一种:若此时光标走到文件末尾,若此时进行读的操作会发现什么都读不出,因为光标已经走到文件末尾了,没有字符可以被读出来。