Python 3 tell()在追加读取模式下与文件指针不同步
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python 3 tell()在追加读取模式下与文件指针不同步,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2803字,纯文字阅读大概需要5分钟。
内容图文
![Python 3 tell()在追加读取模式下与文件指针不同步](/upload/InfoBanner/zyjiaocheng/768/29efe2381af34c5f94c92297784033ab.jpg)
与Python 2(2.7.15)不同,当打开二进制文件进行追加和读取时,我在Python 3(3.6.5)中看到了奇怪的f.tell()行为.如果当前搜索位置不在文件末尾时写入n个字节,则以下事情似乎按预期发生:
>文件指针移动到文件末尾.
>写入n个字节.
> n被添加到文件指针中.
但是,似乎f.tell()没有注意到步骤1,因此f.tell()返回的值与实际文件指针相比偏移了恒定的负数.我在Windows和Linux上都看到了相同的内容.
这里有一些Python 3代码演示了这个问题:
import io
# Create file with some content
f = open('myfile', 'wb')
f.write(b'abc')
print(f.tell()) # 3
f.close()
# Now reopen file in append+read mode and check that appending works
f = open('myfile', 'a+b')
print(f.tell()) # 3
f.write(b'def') # (Append)
print(f.tell()) # 6
# Now seek to start of file and append again -> tell() gets out of sync!
print(f.seek(0)) # 0
print(f.tell()) # 0
f.write(b'ghi') # (Append)
print(f.tell()) # 3!!! (expected 9)
f.write(b'jkl') # (Append)
print(f.tell()) # 6!!! (expected 12)
# Try calling seek without moving file pointer -> tell() starts working again
print(f.seek(0, io.SEEK_CUR)) # 12 (correct)
print(f.tell()) # 12 (correct)
# Read whole file to verify its contents
print(f.seek(0)) # 0
print(f.read()) # b'abcdefghijkl' (correct)
f.close()
Python 3文档有关于在文本文件上使用seek()/ tell()的警告(参见io.TextIOBase),以及关于某些平台上的追加模式的这一警告(参见open()):
[…] ‘a’ for appending (which on some Unix systems, means that all writes append to the end of the file regardless of the current seek position).
但我正在使用二进制文件,并且无论搜索位置如何,写入似乎都会附加到文件的末尾,因此我的问题不同.
我的问题:这种行为是在某个地方(直接或间接)记录下来的,还是至少记录了行为是未指定的?
编辑:
文本文件似乎没有这个问题(在Python 2和3中都没有),因此只有二进制文件不能按预期工作.
Python 3文档(io.TextIOBase)声明tell()为文本文件返回一个“不透明”值(即没有指定值如何表示该位置),并且因为没有提到这是否也适用于二进制文件文件,人们可能会推测我的问题与此不透明度有关.但是,这不可能是真的,因为即使是一个不透明的值必须 – 当给予seek()时 – 将文件指针返回到调用tell()时的位置,并在上面的示例中,当tell()返回第6个然后12在相同的文件位置(文件结束),只有seek(12)实际上会再次将文件指针移动到该位置.因此,值6不能通过文件指针不透明度来解释.
解决方法:
>调用f.seek(t,offset)时,将文件对象的位置更改为t offset
> written = f.write(data)按写入的字节前进位置
> f.tell()返回文件中的当前位置
所以,这里没有问题:
f.seek(0) # position = 0
f.write(b'123') # position += len(b'123') => position = 3
f.tell() # return position, which is equal to 3
并且数据是在当前位置之后立即写入的,因此在这种情况下您不会附加任何内容,而是覆盖现有数据.或者至少,你应该是,但这种行为可能会有所不同,正如你在文档中引用的那样.
内容总结
以上是互联网集市为您收集整理的Python 3 tell()在追加读取模式下与文件指针不同步全部内容,希望文章能够帮你解决Python 3 tell()在追加读取模式下与文件指针不同步所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。