gpt4 book ai didi

python - 使用迭代器从 file.tell() 获取显着偏移

转载 作者:行者123 更新时间:2023-12-01 02:31:57 25 4
gpt4 key购买 nike

看看file.tell(),我希望它能给我一个可以与file.seek()一起使用的位置。但我不确定在实践中如何做到这一点,因为tell()似乎从一开始就将我指向文件的末尾。

这是一些测试数据:

i am line 1
i am line 2
i am line 3

程序:

with open("./test_tell.txt") as fi:
for line in fi:
seekto = fi.tell()
print "position:%d" % fi.tell()
print(line)

#we're at the end
fi.seek(seekto)
print("seekto:%s" % fi.read())

fi.seek(seekto-5)
print("seekto-5:%s" % fi.read())
输出:
position:35
i am line 1

position:35
i am line 2

position:35
i am line 3
seekto:
seekto-5:ine 3

注意我是如何从头到尾到达 35 的吗?如何使迭代器仅前进到每行的末尾,以便 tell 实际上有助于了解我在文件中的位置?我感觉到整个文件被读取为优化,这就是为什么告诉我在最后。

我关心的原因是我正在开发一个基于状态机的程序,该程序运行一个大文件。出于调试目的,我想呈现一个包含后 n 行、当前行和前 n 行的窗口。希望使用告诉位置来提前读取同一文件的不同文件打开情况。这是行不通的,因为tell总是指向结尾。

Python 2.7,以防文件语义发生更改。

最佳答案

您的示例不会触发 Python 2 的错误,但会失败,因为可能出于性能原因,使用迭代器进行读取缓冲

大多数时候,当您逐行阅读时,您不关心文件位置(更一般地说:您不关心文本文件中的文件位置)

因此文件在 1 次操作中被读取,留下文件的结束偏移量。

请注意,Python 3 更加严格:在迭代该行后使用 tell 会出现异常。

OSError: telling position disabled by next() call

一种方法是这样做

  • 二进制模式打开文件(Windows,否则,您将因回车符而发生变化)
  • 通过添加当前行的长度来读取和计算位置

我的代码:适用于 python 2 和 python 3(其中需要解码以摆脱字节表示以做得更好):

with open("./text.txt","rb") as fi:
current_offset = 0
line_pos=[]
for line in fi:
line_pos.append(current_offset)
current_offset += len(line)
print(line)

fi.seek(line_pos[1])
print("seekto:%s" % next(fi))

结果:

b'i am line 1\r\n'
b'i am line 2\r\n'
b'i am line 3\r\n'
seekto:b'i am line 2\r\n'

请注意,我成功地在第二行的开头进行了查找,因此 next(fi) 读取了第二行。

当然,仍然可以将行存储在列表中,除非它太大,在这种情况下,此方法有一些兴趣(即:如果文件没有被另一个写回)处理,否则行偏移信息需要更新)

关于python - 使用迭代器从 file.tell() 获取显着偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46716661/

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