问题
最近写入文件遇到个问题,我已二进制追加模式打开文件,用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
%%%
如果有更好办法请指教