seek()函数?


126

请在这里原谅我的困惑,但是我已经阅读了有关python中seek()函数的文档(必须使用它之后),尽管它对我有所帮助,但我对它的实际含义还是有些困惑,但任何解释都很多谢谢,谢谢。

Answers:


232

关于seek()没有太多的担心。

首先,对打开的文件进行操作时非常有用。

重要的是要注意其语法如下:

fp.seek(offset, from_what)

fp您正在使用的文件指针在哪里;offset表示您将移动多少个职位;from_what定义您的参考点:

  • 0:表示您的参考点是文件的开头
  • 1:表示参考点是当前文件位置
  • 2:表示您的参考点是文件的结尾

如果省略,则from_what默认为0。

永远不要忘记,在管理文件时,该文件中总会存在您当前正在处理的位置。刚打开时,该位置是文件的开头,但是当您使用它时,可能会前进。
seek当您需要walk打开该文件时,对您很有用,就像您要进入的路径一样。


115
+1解释的第二个参数,但我想补充一点,你应该使用常量os.SEEK_SETos.SEEK_CUR和,os.SEEK_END而不是神奇数字012分别。
ArtOfWarfare 2014年

查找位置是文件内容中的字节索引,类似于数组索引。同样有趣的是,如果我们以附加模式“ a”打开文件,则无法找到文件的开头。
anilmwr

3
实际上,在追加模式下,我们可以使用fp.seek(0,0)来查找文件的开头,但是一旦您尝试写入该文件,seek将再次重置为文件的末尾并且内容将被写在末尾。
anilmwr

1
谢谢-学到新的东西,并只有清楚地阅读本解释答案onces
亚当休斯

从文件开头调用seek时,实际上是否每次都从文件开头开始“搜索”?
Theo Stefou

40

当您打开文件时,系统指向文件的开头。您所做的任何读取或写入都将从一开始就发生。一个seek()操作将该指针移动到文件的其他部分,以便您可以在该位置进行读取或写入。

因此,如果您想读取整个文件但跳过前20个字节,请打开文件,seek(20)移至要开始读取的位置,然后继续读取文件。

或者说您想每隔10个字节读取一次,您可以编写一个循环seek(9, 1)(相对于当前位置向前移动9个read(1)字节)(重复读取一个字节)。


14
-1:此答案无法解释第二个参数,实际上,用措辞来说,听起来像第二个参数指示要读取多少个字节。
ArtOfWarfare 2014年

3

seek期望的功能的偏移以字节为单位。

Ascii文件示例:

因此,如果您的文本文件包含以下内容:

simple.txt

abc

您可以跳过1个字节来跳过第一个字符,如下所示:

fp = open('simple.txt', 'r')
fp.seek(1)
print fp.readline()
>>> bc

二进制文件示例收集宽度:

fp = open('afile.png', 'rb')
fp.seek(16)
print 'width: {0}'.format(struct.unpack('>i', fp.read(4))[0])
print 'height: ', struct.unpack('>i', fp.read(4))[0]

注意:致电后,read您将更改读数头的位置,其作用类似于seek


0

对于字符串,请忘记使用WHENCE:使用f.seek(0)放置在文件的开头,使用f.seek(len(f)+1)放置在文件的结尾。使用open(file,“ r +”)读取/写入文件中的任何位置。如果使用“ a +”,则无论将光标放在何处,都只能在文件末尾写入(附加)。


您是在谈论文件还是字符串?
RalfFriedl

对困惑感到抱歉。这都是关于文件的。
Gordon Graham
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.