шукати () функцію?


127

Вибачте, будь ласка, тут мою плутанину, але я прочитав документацію щодо функції шукати () в 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) для позиціонування в кінці файлу. Використовуйте відкритий (файл, "r +") для читання / запису будь-де у файлі. Якщо ви використовуєте "+", ви зможете записувати (додавати) лише в кінці файлу, незалежно від місця розташування курсору.


Ви говорите про файли чи рядки?
RalfFriedl

Вибачте за непорозуміння. Це все про файли.
Гордон Грехем
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.