seek () функция?


127

Пожалуйста, извините за путаницу здесь, но я прочитал документацию относительно функции seek () в python (после того, как ей пришлось ее использовать), и хотя это помогло мне, я все еще немного смущен фактическим значением того, что он делает, любые объяснения много оценил, спасибо.

Ответы:


234

Насчет того, seek()что беспокоиться особо не о чем.

Прежде всего, это полезно при работе с открытым файлом.

Важно отметить, что его синтаксис следующий:

fp.seek(offset, from_what)

где fpуказатель файла, с которым вы работаете; offsetозначает, на сколько позиций вы переместитесь; from_whatопределяет вашу точку отсчета:

  • 0 : означает, что ваша контрольная точка - это начало файла
  • 1 : означает, что вашей точкой отсчета является текущая позиция файла
  • 2 : означает, что ваша контрольная точка - конец файла

если опущено, по from_whatумолчанию 0.

Никогда не забывайте, что при управлении файлами всегда будет место внутри этого файла, над которым вы сейчас работаете. Когда вы просто открываете эту позицию, это начало файла, но по мере работы с ней вы можете продвигаться вперед.
seekбудет вам полезен, когда вам нужно будет пройти walkпо этому открытому файлу, как путь, по которому вы идете.


115
+1 для объяснения второго параметра, хотя я хотел бы добавить , что вы , вероятно , следует использовать константы os.SEEK_SET, os.SEEK_CURи os.SEEK_ENDвместо магических чисел 0, 1и 2, соответственно.
ArtOfWarfare

Позиция поиска - это байтовый индекс содержимого файла, аналогичный индексу массива. Также интересно, что если мы откроем файл в режиме добавления 'a', мы не сможем перейти к началу файла.
anilmwr

3
Фактически в случае режима добавления мы можем искать начало файла с помощью fp.seek (0, 0), но как только вы попытаетесь записать в этот файл, поиск снова будет сброшен до конца файла, а содержимое будет записано в конце ,
anilmwr

1
Спасибо - узнал что-то новое, и нужно было только прочитать этот четко объясненный ответ один раз
Адам Хьюз

при вызове поиска с начала файла, действительно ли он каждый раз начинает «поиск» с начала файла?
Тео Стефу

40

Когда вы открываете файл, система указывает на начало файла. Любое чтение или запись будет происходить с самого начала. А seek()операция перемещает этот указатель на какую - либо другую часть файла , так что вы можете читать или писать на этом месте.

Итак, если вы хотите прочитать весь файл, но пропустить первые 20 байтов, откройте файл, seek(20)чтобы перейти туда, где вы хотите начать чтение, а затем продолжите чтение файла.

Или, скажем, вы хотите прочитать каждый 10-й байт, вы можете написать цикл, который выполняет seek(9, 1)(перемещает на 9 байтов вперед относительно текущих позиций) read(1)(читает один байт), повторяется.


14
-1: в этом ответе не объясняется второй параметр, и на самом деле, как сказано, звучит так, будто второй параметр определяет, сколько байтов будет прочитано.
ArtOfWarfare

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

Извините за путаницу. Все дело в файлах.
Гордон Грэм
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.