Pythonでファイル操作を行う場合、pandasなどのライブラリを使用するケースも多いが、ここではPython組み込みの機能を利用した基礎的なファイル操作方法を紹介する。
コンテンツ
ファイルを読み込む
ファイルを読み込む場合、組み込みのopen関数を使用する。
今回は適当な文字を入力した、テストファイル「~/test.txt」を用意した。
hoge
fuga
open関数では読み込み対象のファイルを絶対パス、または相対パスで指定する必要があるが、JupyterNotebookではデフォルトの作業ディレクトリが「~/」となっているため、今回の場合以下のようにそのままファイル名を指定すればファイルを開くことができる。
f = open('test.txt')
これで変数fに開いたファイルが代入された。
変数fはリストのように扱うことができ、行ごとに処理を行うことができる。
f = open('test.txt')
# 各行に対し繰り返し処理を行う例
for line in f:
print(line.rstrip()) # rstrip関数で末尾の空白を削除
# 改行ごとに文字列をリスト化した例
lines = [x.rstrip() for x in open('test.txt')]
lines # ['hoge', 'fuga']
開いたファイルを閉じる
ファイル操作で、ついつい忘れがちなのがこの動作。
開いたファイルはclose関数で必ず閉じるようにしよう。
f = open('test.txt')
# 何らかの処理
# code...
f.close()
ファイルを開きっぱなしにしていると、システムのリソースを使いっぱなしになり、また他のプログラムがファイルにアクセスできなくなったりと、あらゆる問題が生じてくる。
close関数を記述するのを忘れてしまいがちの人は、以下のwith文を使うと良いだろう。
with open('test.txt') as f:
for line in f:
print(line.rstrip())
こうすることで、withブロックの処理が終了すると自動的にファイルが閉じられるのだ。
Pythonのファイルモード
open関数はデフォルトで読み込みモード(r)でファイルを開くが、第二引数に明示的にファイルモードを指定することで、書き込みモードや追記モードなどでファイルを開くことができる。
ファイルモード | 説明 |
r | 読み込みモード。 |
w | 書き込みモード。 新しいファイルを作成し、同名のファイルがあれば上書きする。 |
x | 書き込みモード。 新しいファイルを作成する。(上書き不可) |
a | 既存のファイルに追記する。 もしファイルが存在しなければ新規作成する。 |
r+ | 読み込みと書き込みを両方おこなう。 |
b | バイナリファイル用モードにする。 ※rbやwbのように指定する。 |
t | テキストモード。(Unicodeにデコードする) ※他のモードをテキストモードにする場合、rtやxtのように指定する。 |
ファイルにテキストを書き込む例
writeメソッド、writelinesメソッドを使うことで、ファイルにテキストを書き込むことができる。
例として新規でファイルを作成し、任意のテキストを書き込む例を見てみよう。
writeメソッドは引数に文字列を取り、ファイルに書き込む。
with open('test2.txt', 'w') as handle:
handle.write('hogehoge')
handle.write('fugafuga')
# test2.txtの中身
# hogehogefugafuga
writelinesメソッドは引数にシーケンスを取る。
txt = ['hogehoge', 'fugafuga']
with open('test3.txt', 'w') as handle:
handle.writelines(txt)
# test3.txtの中身
# hogehogefugafuga
ファイル読み込み後によく使われるメソッド
readメソッド
引数に指定した数の文字を受け取ることができる。
with open('test.txt') as f:
print(f.read(2)) # ho
tellメソッド
tellメソッドは現在のファイル操作の位置が得られる。
以下の例ではreadメソッドで位置が進められているので、この場合tellメソッドの実行結果は2となる。
with open('test.txt') as f:
print(f.read(2)) # ho
print(f.tell()) # 2
seekメソッド
seekメソッドは引数に指定した位置に、ファイル操作の位置を移動させる。
with open('test.txt') as f:
print(f.read(2)) # ho
print(f.read(2)) # ge
f.seek(0)
print(f.read(2)) # ho