【发布时间】:2023-03-22 00:40:02
【问题描述】:
如果我有一些类似文件的对象并执行以下操作:
F = open('abc', 'r')
...
loc = F.tell()
F.seek(loc-10)
寻找是做什么的?是否从文件开头开始并读取loc-10 字节?还是仅仅备份 10 个字节就足够聪明?
【问题讨论】:
如果我有一些类似文件的对象并执行以下操作:
F = open('abc', 'r')
...
loc = F.tell()
F.seek(loc-10)
寻找是做什么的?是否从文件开头开始并读取loc-10 字节?还是仅仅备份 10 个字节就足够聪明?
【问题讨论】:
它是特定于操作系统和 libc 的。 file.seek() 操作委托给 fseek(3) 对实际操作系统级文件的 C 调用。
【讨论】:
fseek,而不是lseek,这意味着在操作系统拥有的任何东西之上都有一个由libc管理的FILE*,而FILE*可能有它自己的位置和缓冲区,因此它甚至可能不必去操作系统/文件系统进行后续读取。
file.seek(offset[, whence])设置文件的当前位置,如 stdio 的 fseek()。从何而来 参数是可选的,默认为 os.SEEK_SET 或 0(绝对文件 定位);其他值为 os.SEEK_CUR 或 1(相对于 当前位置)和 os.SEEK_END 或 2(相对于文件的 结束)。
假设您希望相对于您的位置返回 10 个字节:
file.seek(-10, 1)
【讨论】:
它应该足够聪明,只备份 10 个字节,但我想细节真的取决于你正在使用的文件系统/操作系统/运行时库。
请注意,如果您只想备份 10 个字节,则不需要 tell。
F.seek(-10,1)
【讨论】:
file.seek() set the current read/write position.
file.tell() Returns the file's current position.
因此,当您执行 **loc = F.tell()** 时,您会将当前文件位置存储到 loc 变量中。
而**file.seek()** 接受两个参数**file.seek(offset, from)**
所以你需要定义从哪里偏移文件。 **from** 采用以下值之一0,1,2(0 = 开始,1 = 当前,2 = 结束)
这就是它的工作原理。
【讨论】:
根据文档,你需要做f.seek(offset, from_what),或者在你的情况下,F.seek(-10, loc)
你的例子应该可以工作,但这更明确
【讨论】:
loc 为 1 时有效。