String 在Python3中从文件末尾查找
Python3中的一个变化是取消了在普通文本模式下从文件末尾搜索的功能。普遍接受的替代方案是什么 例如,在Python2.7中,我输入file.seek(-3,2)String 在Python3中从文件末尾查找,string,python-3.x,seek,String,Python 3.x,Seek,Python3中的一个变化是取消了在普通文本模式下从文件末尾搜索的功能。普遍接受的替代方案是什么 例如,在Python2.7中,我输入file.seek(-3,2) 我读过一些关于他们为什么这样做的文章,所以请不要仅仅链接到政治公众人物。我知道使用“rb”可以进行搜索,但这会使我的文本文件以错误的格式读取。在Python 2中,文件数据在读取时没有被解码。向后搜索和多字节编码不能很好地混合(你不知道下一个字符从哪里开始),这就是为什么Python3禁用它的原因 您仍然可以通过查找底层缓冲区对象,
我读过一些关于他们为什么这样做的文章,所以请不要仅仅链接到政治公众人物。我知道使用“rb”可以进行搜索,但这会使我的文本文件以错误的格式读取。在Python 2中,文件数据在读取时没有被解码。向后搜索和多字节编码不能很好地混合(你不知道下一个字符从哪里开始),这就是为什么Python3禁用它的原因 您仍然可以通过查找底层缓冲区对象,但随后必须重新附加新的
TextIOBase
包装器,因为当前包装器将不再知道它位于何处:
import io
file.buffer.seek(-3, 2)
file = io.TextIOWrapper(
file.buffer, encoding=file.encoding, errors=file.errors,
newline=file.newlines)
我已将任何编码和行处理信息复制到
考虑到UTF-16、UTF-32、UTF-8和其他多字节编解码器的can解码可能中断
演示:
您可以将其封装在实用程序函数中:
import io
def textio_seek(fobj, amount, whence=0):
fobj.buffer.seek(amount, whence)
return io.TextIOWrapper(
fobj.buffer, encoding=fobj.encoding, errors=fobj.errors,
newline=fobj.newlines)
并将其用作:
with open(somefile) as file:
# ...
file = textio_seek(file, -2, 3)
# ...
将文件对象用作上下文管理器仍然有效,因为原始文件对象引用仍然附加到原始文件缓冲区对象,因此仍然可以用于关闭文件。对于单字节编码,您始终可以手动解码数据。如果您使用python 3.1,seek仍然是available@IsuruMadusanka:seek在所有Python 3版本中都可用。不可用的是从末尾寻找相对。3.1也不例外。
with open(somefile) as file:
# ...
file = textio_seek(file, -2, 3)
# ...