Re:ゼロから始める文系プログラマ

未経験がプログラミングを通して人生を変える

【Python・ファイル操作】 ~seek~


スポンサードリンク
 

f:id:ShotaNukumizu_1000:20210405111435p:plain

おはようございます!Shotaです。

今日も早速、Pythonに関する記事を書いていきます。

今日はファイルアクセスで利用する「seek」について解説していきます。

 

【目次】

 

 

seek

役割①アクセス位置の移動

前回の記事まで、ファイルアクセスは常に「読み込み専用」あるいは「書き出し専用」で行ってきましたが。読み書き両方できるファイルオブジェクトも作成できます。これには、「+」を使います。

例えば、書き出しモードで読み込みもできるようにするためにはモードを'w+'と指定します。これで読み書きが行えるようになりますが、注意したいのはこれでだけでは思ったように値を読み書きできない点です。実際に動かしてやってみましょう。

 

#想定している内容が表示されないプログラム
import codecs
try:
    with codecs.open('sample.txt', 'w+', 'utf-8') as f:
        while True:
            msg = input('input text:')
            if msg == '':
                break
            f.write(f'{msg}\n')
        print('save all messages.')
        x = 1
        for line in f:
            print(f'{x}: {line.strip()}')
            x += 1

except Exception as e:
    print(f'[ERROR] {type(e)}:{str(e)}')

 

これを実際に実行すると保存されたはずのテキストが何も出力されていません。

 

▼実行結果

input text:あああ
input text:いいい
input text:ううう
input text:
save all messages.

 

本来なら、「save all messages.」のあとにテキストが一行ずつ書き出されるはずなのですが想定通りには動作できませんでした。

この原因はファイル位置にあります。ファイルオブジェクトでは、「現在アクセスしているファイル内の位置」の情報が保持されており、そこからファイルアクセスなどの操作を行うようになっているのです。

writeにより、ファイルの一番最後にファイル位置が移動しているのでそこから値を読み込もうとしても何も取り出せません。書き出した値を取り出したいなら、ファイル位置を先頭に戻さなければいけません。

 

ここで登場するのが、「seek」というメソッドです・

 

ファイルオブジェクト.seek(数値、位置)

第一引数:「オフセット値」(第二引数で指定したい力どれだけ進んだ場所にいるのか指定)

第二引数:基準となる位置(後に紹介)(省略可。省略した場合、ファイルの先頭から第一引数で指定しただけ進んだ位置

第二引数の値は、osモジュールに用意されているので、利用の際には「import os」と記述しておきます。

 

役割:先頭に戻る

seekでファイル位置を移動させてみましょう。値を書き出した後、ファイルの内容がすべて表示されるようにしておきます。

#完成したファイルを読み込むプログラム
import codecs
import os

try:
    with codecs.open('sample.txt', 'w+', 'utf-8') as f:
        while True:
            msg = input('input text:')
            if msg == '':
                break
            f.write(f'{msg}\n')
        print('save all messages.')
        f.seek(0, os.SEEK_SET)
        x = 1
        for line in f:
            print(f'{x}: {line.strip()}')
            x += 1

except Exception as e:
    print(f'[ERROR] {type(e)}:{str(e)}')

 

▼実行結果

input text:おはよう
input text:こんにちは
input text:さようなら
input text:
save all messages.
1: おはよう
2: こんにちは
3: さようなら

 

無事に出力することに成功しました。

ここでは、whileで繰り返し書き出しを行った後、

 

f.seek(0, os.SEEK_SET)

 

 このようにして、ファイルの先頭に位置を移動しています。そしてforで値を出力すれば、ファイルの最初から値が取り出されるようになります。

ここでは、os.SEEK_SETを使っているので、冒頭に以下のimport文を追加してあります。これを忘れるとエラーになるので注意して下さい。

 

import os

 

まとめ

【本日のまとめ】

  • seekメソッドを利用すると、ファイル位置を変更できる。ただし、import osでモジュール名を読み込むことを忘れないように。

 

 

本ブログでは、こんな感じでPythonにまつわる情報や基本的な知識、Pythonの操作方法やニュースをたくさん紹介していきます。毎週日曜日に、普段とは趣向を変えて有名な自己啓発本・ビジネス書を要約・考察するブログを書いていきます。

この記事がいいと思った人はSNSにシェアしてくれると非常に嬉しいです!

明日は日曜日なので、本の要約・解説を行っていきます。取り上げる本は『FACT FULNESS』です。

今日も最後まで読んでくださりありがとうございました!

 

【参考図書】

gihyo.jp