String 在Python3中从文件末尾查找

String 在Python3中从文件末尾查找,string,python-3.x,seek,String,Python 3.x,Seek,Python3中的一个变化是取消了在普通文本模式下从文件末尾搜索的功能。普遍接受的替代方案是什么 例如,在Python2.7中,我输入file.seek(-3,2) 我读过一些关于他们为什么这样做的文章,所以请不要仅仅链接到政治公众人物。我知道使用“rb”可以进行搜索,但这会使我的文本文件以错误的格式读取。在Python 2中,文件数据在读取时没有被解码。向后搜索和多字节编码不能很好地混合(你不知道下一个字符从哪里开始),这就是为什么Python3禁用它的原因 您仍然可以通过查找底层缓冲区对象,

Python3中的一个变化是取消了在普通文本模式下从文件末尾搜索的功能。普遍接受的替代方案是什么

例如,在Python2.7中,我输入file.seek(-3,2)


我读过一些关于他们为什么这样做的文章,所以请不要仅仅链接到政治公众人物。我知道使用“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)

    # ...