【问题标题】:How does Python's seek function work?Python 的 seek 函数是如何工作的?
【发布时间】:2023-03-22 00:40:02
【问题描述】:

如果我有一些类似文件的对象并执行以下操作:

F = open('abc', 'r')
...
loc = F.tell()
F.seek(loc-10)

寻找是做什么的?是否从文件开头开始并读取loc-10 字节?还是仅仅备份 10 个字节就足够聪明?

【问题讨论】:

    标签: python seek


    【解决方案1】:

    它是特定于操作系统和 libc 的。 file.seek() 操作委托给 fseek(3) 对实际操作系统级文件的 C 调用。

    【讨论】:

    • 那么这个平台和实现是否依赖?
    • 是的,实现在 libc 和操作系统之间分开。
    • 那么在不从文件开头开始的情况下是否可以/容易做到这一点?
    • 在大多数平台中,文件位置只是存储在文件句柄表中的一个数字;没有物理驱动器正在寻找。所以没有理由“只备份 10 个字节”。当您进行下一次读取或写入时,libc/OS/文件系统可以智能并意识到您正在读取仍在缓存中且根本未读取的块,或者读取前一个块,因此它只需要寻找一个块(无论如何,现代驱动器上的区别并不重要——以前的虚拟块可能在你的 LVM 阵列中的不同物理驱动器上……)。
    • 另外,请注意这是一个fseek,而不是lseek,这意味着在操作系统拥有的任何东西之上都有一个由libc管理的FILE*,而FILE*可能有它自己的位置和缓冲区,因此它甚至可能不必去操作系统/文件系统进行后续读取。
    【解决方案2】:

    根据Python 2.7's docs

    file.seek(offset[, whence])

    设置文件的当前位置,如 stdio 的 fseek()。从何而来 参数是可选的,默认为 os.SEEK_SET 或 0(绝对文件 定位);其他值为 os.SEEK_CUR 或 1(相对于 当前位置)和 os.SEEK_END 或 2(相对于文件的 结束)。

    假设您希望相对于您的位置返回 10 个字节:

    file.seek(-10, 1)
    

    【讨论】:

      【解决方案3】:

      它应该足够聪明,只备份 10 个字节,但我想细节真的取决于你正在使用的文件系统/操作系统/运行时库。

      请注意,如果您只想备份 10 个字节,则不需要 tell

      F.seek(-10,1)
      

      【讨论】:

      • 感谢分享。这是一个比我举的例子简单得多的实现。
      【解决方案4】:
      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 = 结束)

      这就是它的工作原理。

      【讨论】:

        【解决方案5】:

        根据文档,你需要做f.seek(offset, from_what),或者在你的情况下,F.seek(-10, loc)

        你的例子应该可以工作,但这更明确

        【讨论】:

        • 这是相当误导的。此答案仅在 loc 为 1 时有效。
        猜你喜欢
        • 2017-04-18
        • 2016-02-16
        • 2012-06-08
        • 1970-01-01
        • 2010-12-16
        • 1970-01-01
        • 1970-01-01
        • 2013-05-06
        • 1970-01-01
        相关资源
        最近更新 更多