ばぁど・うぉっちんぐ

セキュリティに強いWeb屋。自由と春を求めて羽ばたく渡り鳥。

このブログはGoogle Analyticsを利用しています

【8日目】Python勉強メモ -ファイルへの入出力-

Pythonでプログラムをしていると、ファイルから情報を読み取ったり、アウトプットとしてテキストファイルに記述する場合がある。

本日はPythonによるファイルへの入出力のお話。

前回はこちら ultrabirdtech.hatenablog.com

ファイルを開く

ファイルを読み書きする場合は、最初にファイルをopenする必要がある。

fileobject = open(filename, mode)

filenameには今回操作対象になるファイル名を指定する。 modeには操作の種類を指定する。

modeには2文字まで指定可能である。 1文字目は操作を意味している。

操作の種類 意味
r 読み出し。
w 書きこみ。ファイルが存在しない場合新規作成、存在する場合は上書き。
x 書き込み。ファイルがまだ存在しないときのみ機能する。上書きによるファイルの損失を防ぐことが可能。
z ファイルが存在する場合は、追記(現在の末尾の後ろへの書き込み)。

2字目はファイルのタイプ。 2字目は指定しないことも可能で、その際はテキスト形式という意味になる。

ファイルのタイプ 意味
t テキスト
b バイト
(なし) テキスト

開いたファイルは閉じる必要がある。 一連のファイルの読み込み、書き込みなどの処理が終わったらファイルをclose()する。

fileobject.close()

※後ほどwithも説明します。

ファイルへの書き込み

write()を使用する。

下記ソースコードfile_write.pyとして保存する。

# ファイルをオープンする
fileobject = open('test.txt', 'wt')

# ファイルに文字列(test)を記入
fileobject.write('test')

# ファイルを閉じる
fileobject.close()

上記処理実行前

$ cat test.txt 

上記処理実行後

$ python file_write.py 
$ cat test.txt 
test

ファイルからの読み取り

read()readline()などを使用する。

fileobject = open('test.txt', 'rt')
print(fileobject.read())
fileobject.close()

=========実行結果=========
test

引数なしでread()を使用すると、ファイル全体を呼び出すことになるため大きなファイルを使用する際は注意が必要になる。その際はread()に引数として数値を渡せば、文字数分のみ読み込んでくれるようになる。

fileobject = open('test.txt', 'rt')
chank = 1
print(fileobject.read(chank))
fileobject.close()

上記ではread()の引数にchankとして数値1を渡しているため、1文字ずつ読み込んでいる。

withを使った自動クローズ

開いたファイルを閉じ忘れると、ファイルが参照されなくなった時にPythonが自動的にclose()処理を行ってくれる。主に関数内で呼び出されれば関数の処理が終わるタイミング、メインプログラムであれば、そのメインプログラムが終わった時だ。(GCと同じタイミングと考えていいらしい)

しかしclose()処理を忘れてしまうと、エラーが発生してしまうと今までの書き込み処理などが全て消失してしまう恐れがある。このエラーが関数が終わる前などGCが発生する前に起きてしまうと処理が失われてしまう。

そのようなclose()忘れを防ぐためにwithというものがある。

with open('test.txt', 'wt') as f:
    t.write('string')

上記のような書き方をするだけで、with句を抜けた際自動的にclose()がされる。

Let's Try

課題1. 10行のファイルを用意して1行ずつ表示するプログラムを作成してみよう

例) 10行のテキストファイル

abc
def
ghi
jkl
mno
pqr
stu
vwx
yz!
???

実行結果

$ python file_readline.py 
abc
def
ghi
jkl
mno
pqr
stu
vwx
yz!
???

課題2. ファイルが存在する場合にxを指定した際にどのようなエラーが出るか確認してみよう

実行結果

$ python file_write_xoption.py 
Traceback (most recent call last):
  File "file_write_xoption.py", line 1, in <module>
    fileobject = open('test.txt', 'xt')
FileExistsError: [Errno 17] File exists: 'test.txt'

次回はこちら ultrabirdtech.hatenablog.com