[Python] ファイルの読み込み、書き込み(上書き、追記)について

Python ファイル操作

Pythonでファイル読み込みや、書き込みをする方法についてまとめます。open関数によるファイルオブジェクトの生成やモード指定(読み込み、上書き、追記)からread関数等によるデータ読み込みや、write関数によるデータ書き込みまで、基本的な使い方について記載します。
# 2019/3/3 記事更新

確認した環境

  • 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処理を自動でやってくれるので便利です。

参考書籍

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

シェアする
ひびきをフォローする
Hbk project