【基本】Pythonのファイルの読み込みと書き込みについて分かりやすく解説!

2023-07-17

Pocket

こんにちは、爽です。皆さん、いかがお過ごしでしょうか?

今回はPythonのファイルの読み込みと書き込みについて確認します。
アプリケーションを開発している時はもちろん、普通に業務をしている時もファイルの読み込みと書き込みをプログラミングで実装したいという場面によく遭遇すると思います。そんな時に時間をかけずにサクッと対応できたらスマートですよね。そんな場面に遭遇したら是非この記事に書いてあることをご参考いただければと思います。

■この記事の対象読者
・Pythonに興味がある方
・Pythonを学び始めてみたい方
・Pythonのファイルの読み込みと書き込みの詳細について知りたい方

なお、私はPythonをAnacondaをインストールしてJupyterで実行しています。MacのAnacondaのインストール方法とJupyterの使い方は下記記事にまとめているので良かったらご参考ください。

それではどうぞ!

ファイル読み込み

基本形

ファイル読み込みの基本はopen()メソッドでファイルを開き、read()メソッドでファイルを読み込み、close()メソッドでファイルを閉じることです。実際にやってみた方が良いと思いますので下記にサンプルを実装します。
なお、実装の前にPythonを実行するフォルダと同じフォルダに読み込み用のファイルを作ります。

あいう
アイウ
123
ABCXYZ
爽

次にこの「test.txt」を下記の手順で読み込みます。

ファイル読み込み手順

open()メソッドでファイルを開く

read()メソッドでファイルを読み込む

close()メソッドでファイルを閉じる

#①ファイルを開く
f = open('test.txt', mode='r')
#②ファイルを読み込む
line = f.read()
#読み込んだ内容を出力する
print(line)
#③ファイルを閉じる
f.close()

# あいう
# アイウ
# 123
# ABCXYZ
# 爽

open()を使う場合はclose()でファイルを閉じてあげないとファイルが開きっぱなしでマシンのスペックを浪費しかねないので忘れないようにしましょう。なお、明示的に閉じなくてもPythonガベージコレクションでいずれ閉じてくれるようですが、いずれにしろ明示的に閉じた方が良いです。

パス指定

パスを指定してファイルを読み込みたい場合はopen()の第一引数に読み込みたいファイルのパスを指定すれば良いです。例えばPythonを実行するフォルダの一つ下のフォルダを読み込みたい場合は下記のように書きます。

#読み込みたいファイルのパスを変数に格納する
file_path = 'directory/test.txt'
#ファイルを開く
f = open(file_path, mode='r')
#ファイルを読み込む
line = f.read()
#読み込んだ内容を出力する
print(line)
#ファイルを閉じる
f.close()

# あいう
# アイウ
# 123
# ABCXYZ
# 爽

文字コードを指定して読み込む

文字コードを指定して読み込む場合はopen()メソッドの第3引数にencodingパラメータを指定すれば良いです。
デフォルトの文字コードはOSに依存し、MACの場合はUTF-8です。

file_path = 'directory/test.txt'
#エンコーディングを指定
f = open(file_path, mode='r', encoding='utf-8') #UTF-8
#f = open(file_path, mode='r', encoding='sjis') #Shift_JIS
line = f.read()
print(line)
f.close()

# あいう
# アイウ
# 123
# ABCXYZ
# 爽

#OSのデフォルトの文字コードを確認
import locale
locale.getpreferredencoding() 
# 'UTF-8'

read(),readline(),readlines()

ここまでの記事ではread()メソッドを使ってきましたが、読み込みの為のメソッドとして他にreadline(),readlines()があります。

メソッド概要特徴
read()ファイルの内容をそのまま取得処理は早いがメモリの消費が大きい
readline()1行ずつ読み込む処理は遅いがメモリの消費量が小さい
readlines()ファイルを全て一度に読み込み、行ごとに分割したリストとして取得処理は早いがメモリの消費が大きい

readline()メソッドはファイルの中身を1行ずつ読み込むメソッドです。
処理は遅いですがメモリの消費量を抑えられるので、大容量のファイルを読み込む時に向いていると思います。

file_path = 'directory/test.txt'
f = open(file_path, mode='r', encoding='utf-8')
#1行ずつ読み込み
line = f.readline()
#1行ずつ出力
while line:
    print(line.rstrip('\n'))
    line = f.readline()
f.close()

# あいう
# アイウ
# 123
# ABCXYZ
# 爽

readlines()メソッドはファイルを全て一度に読み込み、行ごとに分割したリストとして取得するメソッドです。
処理は早いですがメモリの消費量が大きいので、小〜中サイズのファイルを読み込む時に向いていると思います。

file_path = 'directory/test.txt'
f = open(file_path, mode='r', encoding='utf-8')
#ファイルを読み込み
line = f.readlines()
print(line)
f.close()

#行ごとに改行コードで区切って出力
# ['あいう\n', 'アイウ\n', '123\n', 'ABCXYZ\n', '爽']

#整形して出力
for x in line:
    print(x.rstrip('\n'))

#これでもできる
#for x in line:
#    print(x, end='')

# あいう
# アイウ
# 123
# ABCXYZ
# 爽

ファイル書き込み

基本形

ファイル書き込みの基本も読み込みと同じようにopen()メソッドでファイルを開き、write()メソッドでファイルを読み込み、close()メソッドでファイルを閉じることです。
実際にカレントディレクトリに「test2.txt」を作成してみます。

ファイル書き込み手順

open()メソッドでファイルを開く

write()メソッドでファイルを書き込む

close()メソッドでファイルを閉じる

file_path = 'test2.txt'
#上書きモードでファイルオープン
f = open(file_path, mode='w')
#ファイルを書き込み
f.write('test')
#ファイルを閉じる
f.close()

こうするとカレントディレクトリに「test2.txt」を作成できました。

test

modeの種類

ファイル書き込みの際のopenのパラメータのmodeには何種類かありますので下記にまとめてみます。

mode概要特徴
w上書きモードファイルがない場合は新規作成、同名のファイルがある場合は上書きを行う
x新規作成モードファイルがない場合は新規作成、同名のファイルがある場合はエラー
a追記モードファイルがない場合は新規作成、同名のファイルがある場合は追記を行う
wbバイナリファイルの上書きモードバイナリファイルを作成する
バイナリファイルの読み込みは'rb'

modeが’w’の場合は上書きになるため、同名のファイルが存在する場合は、元々そのファイルに書いてある内容は消えます。

test
file_path = 'test2.txt'
#上書きモードでファイルオープン
f = open(file_path, mode='w')
#ファイルを書き込み
f.write('テスト')
#ファイルを閉じる
f.close()
テスト

一方でmodeが’a’の場合は追記になるため、同名のファイルが存在する場合は、そのファイルに追記されます。

file_path = 'test2.txt'
#上書きモードでファイルオープン
f = open(file_path, mode='a')
#ファイルを書き込み
f.write('test')
#ファイルを閉じる
f.close()
テスト
test

modeが’x’の場合は、ファイルが存在しない場合は新規作成されますが、ファイルが存在する場合はエラーとなります。

file_path = 'test2.txt'
#新規作成モードでファイルオープン
f = open(file_path, mode='x')
#ファイルを書き込み
f.write('テスト')
#ファイルを閉じる
f.close()

# ---------------------------------------------------------------------------
# FileExistsError                           Traceback (most recent call last)
# Input In [18], in <cell line: 3>()
#       1 file_path = 'test2.txt'
#       2 #新規作成モードでファイルオープン
# ----> 3 f = open(file_path, mode='x')
#       4 #ファイルを書き込み
#       5 f.write('テスト')

# FileExistsError: [Errno 17] File exists: 'test2.txt'

writelines()

writelines()メソッドは引数にリストを取り、リストの中身を繋げて書き込みできるメソッドです。

l =['a', 'i', 'u']

file_path = 'test2.txt'
f = open(file_path, mode='w')
#リストを繋げて書き込み
f.writelines(l)
#ファイルを閉じる
f.close()
aiu

ちなみに入れ子になっているリストを繋げて書き込みする為には、ループとwrite(',’.join(リスト))を組み合わせます。

#入れ子のリスト
l = [
    ['a', 'i', 'u'],
    ['A', 'B', 'C']
]   

file_path = 'test2.txt'
f = open(file_path, mode='w')
#リストを繋げて書き込み
for x in l:
    f.write(','.join(x))
    f.write('\n')
#ファイルを閉じる
f.close()
a,i,u
A,B,C

withステートメントでファイルの読み込みと書き込み

上記までがファイル読み込みと書き込みの基本ですが、open()メソッドを使う場合、最後に必ずclose()メソッドでファイルを閉じなければならないので少し手間ですよね。
従って実際の開発ではwithステートメントを使ってファイルの入出力をする事が多く、実際に推奨もされています。

text = """\
123
ABC
あいう
アイウ
"""

file_path = 'test2.txt'
#withステートメントでファイルを書き込み
with open(file_path, mode='w', encoding='utf-8', newline='\n') as f:
    f.write(text)
123
ABC
あいう
アイウ

withステートメントを使えばclose()メソッドを書き忘れる心配もなく、コードもスッキリします。
また、読み込みも同じ要領で実行できます。

file_path = 'test2.txt'
#withステートメントでファイルを読み込み
with open(file_path, mode='r', encoding='utf-8', newline='\n') as f:
    print(f.read())
123
ABC
あいう
アイウ

csvファイルの読み込みと書き込み

csvファイルの拡張子が.csvで終わるカンマ区切りのテキストファイルです。
ちなみにWindowsで開くとExcelファイルで開かれることもありますが、Excelファイルだと各セルの頭の0が落ちてしまったりと、予期しない挙動が発生する場合がある為、なるべくエディタやメモ帳で開いた方が良いです。
(エンジニアとしてはcsvをExcelで編集されてファイルがおかしな形で書き換えられると本当にイライラします笑)
さて、余談は以上としてcsvファイルの読み込みと書き込み方法を確認していきます。

書き込み

csvファイルを扱うにはcsvライブラリをimportする必要があります。
そして下記の要領でcsvにデータを出力します。

#csvライブラリをimport
import csv

#書き込みしたいcsvファイルをopen
with open('test.csv', 'w', newline='') as csv_file:
#Windowsの場合は、改行コードがCRLF(\r\n)となり、csv読み込みの際に2行改行されてしまうようなので下記のように「newline=''」を入れる
#with open('test.csv', 'w', newline='') as csv_file:
    #カラム名設定
    fieldnames = ['ID', 'NUMBER']
    #csvのオブジェクト作成
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
    #headerのみのcsvを作成
    writer.writeheader()
    #辞書型でレコードを作成
    writer.writerow({'ID':'A', 'NUMBER':'1'})
    writer.writerow({'ID':'B', 'NUMBER':'2'})
ID,NUMBER
A,1
B,2

なお、5行目にコメントで書いていますが、Windowsの場合は改行コードがCRLF(\r\n)となり、csv読み込みの際に2行改行されてしまうようなので、ファイルopen時のパラメータnewlineに"を指定することで綺麗にcsvファイルを出力できます。

読み込み

csvの読み込みは下記の手順で実行します。

csvファイル読み込み手順

読み込みしたいcsvファイルをopen

DictReader()メソッドでcsvのオフジェクトを作成

ループで1行ずつ操作

#csvライブラリをimport
import csv

#読み込みたいcsvファイルをopen
with open('test.csv', 'r') as csv_file:
    #csvのオブジェクト作成
    reader = csv.DictReader(csv_file)
    #ループで1行ずつ操作
    for row in reader:
        print(row['ID'], row['NUMBER'])
# A 1
# B 2

参考資料

この記事はUdemyのPython+FlaskでのWebアプリケーション開発講座!!~0からFlaskをマスターしてSNSを作成する~という講座と現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルという2つの講座を参考にさせていただき、作成しました。

Python+FlaskでのWebアプリケーション開発講座!!~0からFlaskをマスターしてSNSを作成する~

Udemyより抜粋

当講座は最低限のWeb開発の知識を知っていることが前提とはなりますが、とにかくPythonの説明とFlask開発の為の説明が充実しているのでおすすめです。
28時間に及ぶ長丁場の講座にはなりますが、絶対に聞く価値がある講座です。
これをマスターすればPythonでどんなアプリケーションでも作ることができると思います。

当講座のおすすめポイントを以下にまとめておきます。

当講座のおすすめポイント

とにかく説明が充実している

Webアプリ開発におけるフレームワークがなぜ有益なのか知ることができる

セキュリティ対策、Ajaxなどの技術も知れる

現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル

画像に alt 属性が指定されていません。ファイル名: a1ee3d048d6aa860662b6f58c4aa167f-1024x328.png

当講座はPythonの基礎から応用まで幅広く学べる講座なのでおすすめです。
この講座の講師はとにかくPythonについての知識が豊富ですし、話も適度な速さで聞き取りやすいです。さすがのシリコンバレーです。
また、最後の方に機械学習で使うライブラリについても解説があるので、データサイエンス・AIについても多少知ることができます。

当講座のおすすめポイントを以下にまとめておきます。

当講座のおすすめポイント

シリコンバレーで働いているということもあり、講師のPythonの知識が豊富

話も適度な速さで聞き取りやすい

コードの意味だけでなく、それをどう応用するかまで解説してくれる

なお、Udemyについては以下の記事でまとめていますのでご参考ください。

まとめ

ということで、今回はPythonのファイルの読み込みと書き込みについて解説しました。
冒頭にも書きましたが、実務でこの辺をサクッと実装できるとかなり業務効率が上がると思うので是非マスターしておきたいですね。
では、今回はここまでとさせていただきます。