Python3 seek()中间追加失败

问题

最近写入文件遇到个问题,我已二进制追加模式打开文件,用seek定位到文件中某位置,tell返回当前位置为我定位的位置,最后发现写入时还是在文章末尾。难道我的seek没起作用。

直到我看到这一段:
https://www.yiibai.com/python3/file_seek.html

请注意,如果文件被打开使用的是’a’或’A+‘追加,任何seek()操作将在下次写时撤消。
如果该文件只打开使用 ‘A’ 追加模式写入,这种方法本质上是一个无操作,但是读取启用(模式’A+’),它在追加模式打开的文件非常有用。
如果文件在文本模式下使用“t”,只有 tell() 返回偏移开是合法的。其他偏移时会导致不确定的行为。
请注意,并非所有的文件对象都是可搜索。

seek简介

seek()

seek() 方法用于移动文件读取指针到指定位置。

seek() 方法如下:
fileObject.seek(offset[, whence]) 参数 offset – 开始的偏移量,也就是代表需要移动偏移的字节数

whence:可选,默认值为
0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

返回值 该函数没有返回值。

tell() 返回文件的当前位置。

测试

这是我1.TXT中的内容:

1234567890
qwertyuiop
asdfghjkl;’
zxcvbnm,/.

以“rb”模式读取

with open("1.txt","rb") as f:
    f.seek(12)
    print(f.tell())
    print(f.readline())

返回值

12
b'qwertyuiop\r\n'

成功从第12个字节开始读取。

以“ab+”打开,读取结果与“rb”相同

but,写入的话还是在文章末尾开始

with open("1.txt","ab+") as f:
    f.seek(12)
    print(f.tell())
    print(f.write(b"%%%"))

1.txt内容:

1234567890
qwertyuiop
asdfghjkl;’
zxcvbnm,/.
%%%

解决(?)

有一种方法是把指定位置到最后的数据删除,然后追加写入,或者全部读取,修改后在重新写入。

truncate() #删除当前指针后的内容

truncate() 用于从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后 V 后面的所有字符被删除,其中
Widnows 系统下的换行代表2个字符大小。

with open("1.txt","a+") as f:
    f.seek(12)
    print(f.tell())
    print(f.truncate())
    print(f.write("%%%"))

输出
12
12
3
1.txt内容为:

1234567890
%%%

如果有更好办法请指教

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值