gpt4 book ai didi

string - 在python 3中从文件末尾查找

转载 作者:行者123 更新时间:2023-12-04 18:40:18 31 4
gpt4 key购买 nike

python 3 中的一项更改是删除了在普通文本模式下从文件末尾查找的功能。普遍接受的替代方案是什么?

例如在 python 2.7 我会输入 file.seek(-3,2)

我已经阅读了一些关于他们为什么这样做的信息,所以请不要只链接到 PEP。我知道使用 'rb' 可以让我搜索,但这会使我的文本文件以错误的格式读取。

最佳答案

在 Python 2 中,文件数据在读取时没有被解码。向后搜索和多字节编码不能很好地混合(你无法知道下一个字符从哪里开始),这就是为什么它在 Python 3 中被禁用。

您仍然可以通过 TextIOBase.buffer attribute 在底层缓冲区对象上查找,但随后您必须重新附加一个新的 TextIOBase包装器,因为当前的包装器将不再知道它在哪里:

import io

file.buffer.seek(-3, 2)
file = io.TextIOWrapper(
file.buffer, encoding=file.encoding, errors=file.errors,
newline=file.newlines)

我已将所有编码和行处理信息复制到 io.TextIOWrapper() object .

考虑到这可以解码 UTF-16、UTF-32、UTF-8 和其他多字节编解码器。

演示:
>>> import io
>>> with open('demo.txt', 'w') as out:
... out.write('Demonstration\nfor seeking from the end')
...
38
>>> with open('demo.txt') as inf:
... print(inf.readline())
... inf.buffer.seek(-3, 2)
... inf = io.TextIOWrapper(inf.buffer)
... print(inf.readline())
...
Demonstration

35
end

您可以将其封装在一个实用函数中:
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)

# ...

使用文件对象作为上下文管理器仍然有效,因为原始文件对象引用仍然附加到原始文件缓冲区对象,因此仍可用于关闭文件。

关于string - 在python 3中从文件末尾查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27582214/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com