・macOS Big Sur
・Python3.8
ファイル操作
ファイル操作の手順
- ファイルを開く。(ファイルオブジェクトの取得)
- ファイルの編集。(読み込み・書き込み)
- ファイルを閉じる。
ファイルを開く
ファイル操作を行う際は、組み込み関数である「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」ファイルを事例にコードサンプルを載せます。
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 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.