Pythonでファイル読み込みや、書き込みをする方法についてまとめます。open関数によるファイルオブジェクトの生成やモード指定(読み込み、上書き、追記)からread関数等によるデータ読み込みや、write関数によるデータ書き込みまで、基本的な使い方について記載します。
確認した環境
- OS: Ubuntu 16.04LTS
- Python 3.7.0
ファイルオブジェクトを開く
まず、open()関数を使ってファイルオブジェクトを生成します。組み込み関数なので特にimportするモジュールはありません。
使い方は、
- 第一引数: 開きたいファイルのパスを指定
- 第二引数: モード(読み込み/書き込み)を設定
以下は、カレントディレクトリに格納されているファイル:’file00.txt’をReadモードで開く例です。
ファイルを開くことが出来ない場合はエラーが返ります。
>>> f = open('./file00.txt', 'r')
尚、第二引数で設定するモードは、ファイル読み込み・書き込み(上書き、追記)に併せて下記のように設定します。
設定値 | 意味 |
---|---|
r | 読み込み(デフォルト) |
w | 書き込み ファイルが存在する場合は、最初にファイルを切り詰める(上書きする) |
x | 排他的生成 ファイルが既に存在する場合はエラーを返す< |
a | 書き込み ファイルが既に存在する場合は、最後に追加する |
b | バイナリモード |
t | テキストモード(デフォルト) |
+ | 更新のためにディスクファイルを開く(読み書き両用) |
データの読み込み
3つの読み込み方法があります。
以下の例は、上記例の’file00.txt’のファイルオブジェクトが生成されていることを前提とします。
ファイル全体を一つの文字列として読み込む
read()メソッドを使います。以下に例を示します。
#ファイル全体を一つの文字列として読み込み
>>> data = f.read()
>>> data
'apple 10\nOrange 20\nGrape 24\nPeach 34\n'
#ファイルオブジェクトを閉じる
>>> f.close()
最後にclose()メソッドでファイルオブジェクトを閉じるのを忘れずに。
一行だけを読み込む
一行だけを読み込むには、readline()メソッドを使います。
以下に例を示します。
#一行だけ読み込み
>>> data = f.readline()
#ファイルオブジェクトを閉じる
>>> f.close()
#読み込んだデータ
>>> data
'apple 10\n'
一行ずつの文字列のリストとして読み込む
一行ずつの文字列のリストとして読み込むには、readliens()メソッドを使います。
#一行ずつの文字列のリストとして読み込み
>>> data = f.readlines()
#ファイルオブジェクトを閉じる
>>> f.close()
#読み込んだデータ
>>> data
['apple 10\n', 'Orange 20\n', 'Grape 24\n', 'Peach 34\n']
尚、同様の動作は、ファイルオブジェクトがイテラブルであることを利用して、forループを使って以下の様にも書けます。
>>> data = []
>>> f = open('./file00.txt', 'rt')
>>> for l in f:
... data.append(l)
...
>>> f.close()
>>> data
['apple 10\n', 'Orange 20\n', 'Grape 24\n', 'Peach 34\n']
改行コードを取り除く
ところで、上記の例で見たように、読み込んだデータには改行コードが含まれます。ファイルを読み込んでその中に書いてあるパラメータを取り出して何かの処理に使う場合、この改行コードが原因でプログラムが思ったとおり動かない場合があります。
こういった場合は、下記のようにstrip()メソッドで改行コードを削除します。
#ある一つのデータの改行コードを除く
>>> data[0].strip()
'apple 10'
#リストの全要素の改行コードを除く
>>> list(map(lambda x:x.strip(), data))
['apple 10', 'Orange 20', 'Grape 24', 'Peach 34']
<参考記事>strip()メソッドについてはこちらの記事でも解説しています。ご参照ください。
データの書き込み
データの書き込みはwrite()メソッドを用います。このメソッドは書き込んだ文字数を返します。
また、ファイルへの書き込み方法として、「上書き」と「追記」の2つあります。
上書きモードで書き込む
ファイルへ新規に書き込む(上書き)には、open()メソッドのモードを’w’に設定します。ファイルが存在しない場合は、新規に作成されます。
#上書きモードでファイルオブジェクトオープン
>>> f = open('./file01.txt', 'w')
#データ書き込み
>>> f.write("Book 100\n")
8
>>> f.close()
#ファイルに書き込まれているか確認
>>> f = open('./file01.txt', 'rt')
>>> f.read()
'Book 100'
>>> f.close()
書き込みモードの際も、最後にclose()メソッドでファイルオブジェクトを閉じるのを忘れずに。
これを忘れると、書き込んだデータが反映されません。
追記モードで書き込む
ファイルへ、元からあるデータに追記して書き込む場合は、open()メソッドのモードを’a’に設定します。ファイルが存在しない場合は、新規に作成されます。
#追記モードでファイルオブジェクトオープン
>>> f = open('./file01.txt', 'a')
#データ書き込み
>>> f.write("Desk 200")
8
>>> f.close()
#ファイルに追記で書き込まれているか確認
>>> f = open('./file01.txt', 'r')
>>> f.read()
'Book 100Desk 200'
>>> f.close()
書き込み時は改行コードは付与されません。改行コードが必要な場合は例えば’\n’.join(str)やstr+’\n’などで付与することが必要です。
withステートメントで記述する
ファイルの読み書きのあとは、必ずclose()メソッドを呼び出して閉じておきます。
上記の例のように、close()メソッドを毎回記載するのも良いですが忘れそうです(私だけか。。。)。そこで便利なのが、withステートメントを用いる方法です。ファイルオブジェクトをopenする際にclose処理も自動的に実施してくれるので便利だと思います。
以下の例は、最後にファイルオブジェクトが閉じているかf.closedでチェックしています。
>>> with open('./file00.txt', 'r') as f:
... f.read()
...
'apple 10\nOrange 20\nGrape 24\nPeach 34\n'
#クローズ済か確認
>>> f.closed
True
きちんとクローズ処理がされいることが確認できます。
まとめ
Pythonにおけるファイルの読み込み、書き込みについてまとめました。
withステートメントを使うと、最後のclose処理を自動でやってくれるので便利です。