python文件读写原理的一些理解:r,r+,w,w+,a,a+,以及seek()方法

理解文件中的读取或者写入顺序要先知道对文件进行读写时它的工作模式:在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+:即可读也可以写,需要文件存在。文件光标在开头的第一个字节,这里分为两种情况:
第一种:先写后读:
由于文件的光标处于开头第一个字节,这就导致了原文件中光标的位置存在字符,则会被新写入的字符覆盖,即光标所到的位置如有字符则会被新字符覆盖,若光标所在的位置无字符,则写入新的字符。这里又产生了两种情况:
第一种:若此时光标走到文件末尾,若此时进行读的操作会发现什么都读不出,因为光标已经走到文件末尾了,没有字符可以被读出来。
第二种:若此时光标不在文件末尾,则会输出后续的字符。
在这两种情况下,若你想读出此前写入的字符你便可以用f.seek(x,x)的方法移动光标。
第二种:先读后写:
与上诉类似,光标开始处于开头第一个字节处,读的时候顺着光标的移动读出字符,若走到文件末尾进行写则不会对原有字符进行覆盖,而是追加。若是光标所在位置有字符时,进行写入则是覆盖光标所在的字符。
总结:'r’或者‘r+’模式下,文件的光标处于开头第一个字节处。

‘w’:只对文件进行全覆盖写入,若文件不存在,则会新建一个文件,文件光标处于文件开头。

‘w+’:可读可写(全覆盖),若文件不存在,则会新建一个文件,文件光标处于文件开头。这里也分为两种情况:
第一种:先读后写:由于是’w+'方式打开文件,文件内容被清除,所以什么都读不出。
第二种:先写后读:写入的字符会沿着光标为移动写入文件,写完后读会发现什么都读不出,因为此时光标处于末尾且光标指向的位置并无字符,此时可以f.seek()把光标移动到要读取的位置进行读操作。
总结:在’w’,'w+'模式下当我们open()时,原文件内容会被清除,开始时光标处于开头第一个字节处。

‘a’:对文件进行追加,若文件不存在会新建文件,文件光标位于文件末尾。
’a+‘:可读可写,若文件不存在则会新建文件,文件光标处于文件末尾。分为两种情况:
第一种:先读后写:
由于文件光标处于末尾,所以什么都读不出,此时可以f.seek(),移动光标到读取位置,读完后若要进行写入操作,不管光标处有无字符,光标都会自动移动到末尾处进行追加,若此时又要读取,则在用一次f.seek()。
第二种:先写后读:
由于文件光标处于末尾,所以写入时进行追加,此时要读取,则在用f.seek()。
总结:‘a’, 'a+'模式下文件光标处于文件末尾,只要写入光标便会自动回到末尾,即只会追加。

可以自己用简单的代码尝试一下,实践出真知嘛,这样印象才会深啊。
第一次写这么多,有错误之处劳烦指出,每天进步一点点。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值