【发布时间】:2018-03-24 19:22:59
【问题描述】:
看着 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 实际上有助于知道我在文件中的位置?我感觉到整个文件被读取为优化,这就是为什么 tell 把我放在最后。
我关心的原因是我正在开发一个基于状态机的程序,该程序通过一个大文件运行。出于调试目的,我想呈现一个包含n-lines back、当前行和 n-lines ahead 的窗口。希望通过打开同一个文件的不同文件来寻求使用tell位置来读取。这是行不通的,因为 tell 总是指向结尾。
Python 2.7,以防文件语义发生变化。
【问题讨论】:
-
I/O 被缓冲,所以
ftell会给出错误的结果。 -
在 python 3 中不起作用:混合文件迭代器和 ftell 不起作用。
-
甚至打开非缓冲
open("./test_tell.txt", "r", 0),或逐行缓冲open("./test_tell.txt", "r", 1),都不起作用?无论如何,当我尝试时它没有,仍然是 35。 -
在不先读取所有 eol 字符的情况下,如何获得 ahead 行数?但无论如何:如果您想知道当前位置,为什么不记录读取的 bytes 计数?
-
@ekhumoro 不确定您所说的第一位是什么意思 - 如前所述,我打算打开第二个文件并寻找当前位置,然后提前读取。至于你的建议 - 是的,我同意如果我自己做簿记它会起作用,但是......
tell似乎适合我的用例。这只是为了调试。还有一点好奇——尽管我知道缓冲是如何导致这种情况的,但捕捉 Python 代码以意想不到的方式表现是最不寻常的。
标签: python python-2.7 file-io