seek()関数?


127

ここで私の混乱を許してください。Pythonのseek()関数に関するドキュメントを読みました(使用する必要があります)。それでも、実際の意味について少し混乱していますが、説明はたくさんあります。感謝します、ありがとう。

回答:


233

seek()あまり心配する必要はありません。

まず、開いているファイルを操作するときに便利です。

その構文は次のとおりであることに注意することが重要です。

fp.seek(offset, from_what)

fp作業しているファイルポインターはどこですか。offset移動するポジションの数を意味します。from_what参照ポイントを定義します。

  • 0:参照ポイントがファイルの先頭であることを意味します
  • 1:参照ポイントが現在のファイル位置であることを意味します
  • 2:参照ポイントがファイルの終わりであることを意味します

省略した場合のfrom_whatデフォルトは0です。

ファイルを管理するときは、常に現在作業しているファイル内の位置が存在することを忘れないでください。開いたばかりの場合、その位置がファイルの先頭になりますが、ファイルを操作するときに、進むことができます。開いているファイル
seekwalk沿って移動する必要があるときに、移動先のパスと同じように役立ちます。


115
私はあなたがおそらく定数を使用する必要があることを追加したいが、二番目のパラメータを説明するための1 os.SEEK_SETos.SEEK_CUR、およびos.SEEK_END代わりにマジックナンバーを012それぞれ。
ArtOfWarfare 2014

シーク位置は、配列インデックスと同様に、ファイルのコンテンツへのバイトインデックスです。追加モード「a」でファイルを開いた場合、ファイルの先頭を探すことができないことも興味深いです。
anilmwr

3
実際に追加モードの場合、fp.seek(0、0)を使用してファイルの先頭にシークできますが、そのファイルに書き込もうとすると、シークは再びファイルの最後にリセットされ、内容は最後に書き込まれます。
anilmwr

1
ありがとう-新しいことを学び、この明確に説明された回答を1回読むだけで済みました
Adam Hughes

ファイルの先頭からseekを呼び出すと、実際には毎回ファイルの先頭から「シーク」を開始しますか?
Theo Stefou

40

ファイルを開くと、システムはファイルの先頭を指し示します。読み取りまたは書き込みは最初から行われます。seek()あなたがその場所で読み取りまたは書き込みできるように、ファイルのいくつかの他の部分へのポインタ操作が移動します。

したがって、ファイル全体を読み取るが最初の20バイトをスキップする場合は、ファイルを開いて、seek(20)読み取りを開始する場所に移動してから、ファイルの読み取りを続行します。

または、10バイトごとに読み取りたい場合はseek(9, 1)read(1)(現在の位置から9バイト先に移動)、(1バイトを読み取る)、繰り返すループを作成できます。


14
-1:この答えは、2番目のパラメーターを説明できません。実際、2番目のパラメーターが読み取るバイト数を指示しているように、2番目のパラメーターが指示するように聞こえます。
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

混乱させて申し訳ありません。それはすべてファイルに関するものです。
ゴードングラハム、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.