Python

【Python 13】ファイル操作

環境

macOS Big Sur
Python3.8

ファイル操作

ファイル操作の手順

  1. ファイルを開く。(ファイルオブジェクトの取得)
  2. ファイルの編集。(読み込み・書き込み)
  3. ファイルを閉じる。

ファイルを開く

ファイル操作を行う際は、組み込み関数であるopen()関数」を使用し、ファイルが開かれた状態のオブジェクト(「ファイルオブジェクト」)を取得します。

ファイルオブジェクトの取得

open('ファイル名', 'モード')

※ファイルがカレントディレクトリに無い場合は、ファイルパスを指定します。

※第2引数である「モード」は、ファイルの取扱方法の指定になります。省略した場合はデフォルトの「'rt'」が指定されます。

主なモード 内容
r 読み込み専用。デフォルトの設定です。
w 書き込み専用(ファイルがない場合は新規作成、ファイルがある場合は内容を空にして新規作成)。読み込みはできません。
x 書き込み専用(ファイルがある場合はエラー)。読み込みはできません。
a 書き込み専用(ファイルがある場合は末尾に追記)。読み込みはできません。
+ r, w, aの後につけることで、読み書き両方できるようにします。r+は先頭から読み書き(書き込み時は上書きする。例えば、「abcd」に「123」を書き込むと「123d」となる。)。w+は新規作成(既存データはオブジェクト作成時に削除される。)。a+は末尾から読み書き。
t テキストモード。デフォルトの設定です。r,w,x,aの後に続けて入力(例えば「rt」のように入力)。
b バイナリモード。r,w,x,aの後に続けて入力(例えば「rb」のように入力)。

ファイルを閉じる

ファイル操作が終了したら、「close()メソッド」でファイルを閉じます。

ファイルを閉じる

ファイルオブジェクト.close()

シーク位置

ファイルは、読み書きする度にその位置を記憶していきます。この位置を「シーク位置」といいます。ワープロソフトでいうカーソル位置のイメージです。

シーク位置を調べるには「tell()メソッド」を使用します。

シーク位置を調べる

ファイルオブジェクト.tell()

※ファイルの先頭から何バイト離れているかが返されます。

また、シーク位置を任意の位置に移動する場合は「seek()メソッド」を使用します。

シーク位置を移動する

ファイルオブジェクト.seek(バイト数)

※引数「0」で先頭に移動します。

ファイルの読み込み

ファイルを読み込むには、まず「読み込み可能なモード」でファイルオブジェクトを取得します。

以下はファイルを読み込むための主なメソッドですが、いずれのメソッドも引数に数値を渡すことで、読み込むバイト数を指定することができます。

主なメソッド 内容
read() ファイルを全て読み込み、1つの文字列として返します。
readline() ファイルを1行読み込み、文字列として返します。
readlines() ファイルを行単位で読み込み、各行を要素とするリストを返します。

for文によるループでも、テキストファイルを1行ずつ取り出すことができます。

以下の「alphabet.txt」ファイルを事例にコードサンプルを載せます。

alphabet.txt

abcdefghi
jklmnopqr
stuvwxyz

>>> f = open('alphabet.txt', 'r')  # ファイルオブジェクトを取得します。
>>> f.read()  # ファイルを読み込みます。シーク位置は末尾に移動します。
'abcdefghi\njklmnopqr\nstuvwxyz'
>>> f.read()  # シーク位置が末尾にあるため、何も読み込まれません。
''
>>> f.tell()  # シーク位置を調べます。
28
>>> f.seek(0)  # シーク位置を始めに移動します。
0
>>> f.readline()  # 1行読み込みます。シーク位置は1行目の末尾に移動します。
'abcdefghi\n'
>>> f.readline()  # 1行読み込みます。2行目が読み込まれます。シーク位置は2行目の末尾に移動します。
'jklmnopqr\n'
>>> f.seek(0)  # シーク位置を始めに移動します。
0
>>> f.readlines()  # 行ごとに読み込みリストを返します。シーク位置は末尾に移動します。
['abcdefghi\n', 'jklmnopqr\n', 'stuvwxyz']
>>> f.seek(0)  # シーク位置を始めに移動します。
0
# for文で1行ずつ取り出すこともできます。
>>> for i in f:
...     i
... 
'abcdefghi\n'
'jklmnopqr\n'
'stuvwxyz'
>>> f.close()  # ファイルを閉じます。

 

ファイルの書き込み

ファイルに書き出すには、まず「書き込み可能なモード」でファイルオブジェクトを取得します。

以下はファイルに書き込むための主なメソッドです。

主なメソッド 内容
write() 引数の内容をファイルに書き込みます。書き込まれた情報量がバイト数で返されます。
writelines() 引数で渡したシーケンスを書き込みます。

 

>>> f = open('number.txt', 'w+')  # ファイルオブジェクトを取得します。
>>> f.write('123\n')  # ファイルに文字列を書き出します。
4
>>> f.seek(0)  # シーク位置を始めに移動します。
0
>>> f.read()  # ファイルを読み込みます。
'123\n'
>>> f.writelines(['456\n', '789\n'])  # シーケンスを書き込みます。
>>> f.seek(0)  # シーク位置を始めに移動します。
0
>>> f.read()  # ファイルを読み込みます。
'123\n456\n789\n'
>>> f.close()  # ファイルを閉じます。

 

with文

「with文」を使用することで、ファイル操作終了時のclose()メソッドを省略した表記が可能となります。

with文

with open('ファイル名', 'モード') as 変数名:
    処理ブロック

※ファイルオブジェクトは「変数名」に代入されます。

※処理が終了すると自動的にclose()メソッドが呼び出され、ファイルを閉じます。

>>> with open('number.txt', 'r') as f:
...     f.read()
... 
'123\n456\n789\n'
>>> f.read()  # 処理終了後、ファイルオブジェクトは閉じられているため、「f」は呼び出せません。
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.