Developer

【Python独学】テキストファイルを読み込む
2021.03.31
Lv1

【Python独学】テキストファイルを読み込む

今回は、Pythonでテキストファイルを扱ってみましょう!

  • Pythonでテキストファイルを読み込む
  • ファイルオブジェクトの内容を読み込むメソッド

Pythonでテキストファイルを読み込む

Pythonでは、PCの中にある各種ファイルを読み込んで、そのファイルをプログラム内で扱うことができます。
例えば、テキストファイルを読み込んで内容を画面上に表示したり、
内容から条件に応じた部分のみを抽出したりと、様々な操作を行うことができます。
まずははテキストファイルの読み込みについて、以下の2点からみていきましょう。

・open関数でファイルを読み込む
・ファイルオブジェクトについて

open関数でファイルを読み込む

Pythonでテキストなどのファイルを扱う際は、まずそのファイルをプログラム上に読み込む必要があります。
そこで使われるのがopen関数です。
open関数は、指定したファイルを開いてプログラム上でその中身を読み込めるようにしてくれます。

Pythonでファイルを開いて扱う際の流れとしては、

ファイルを開く → 何らかの処理 → クローズ

といった流れになります。
一番はじめの「ファイルを開く」段階を担当するのがopen関数になります。

open関数

open(file, mode=’r’)

file:開くファイル名
mode:ファイルを開く際のモードを指定

open関数は、開きたいファイルの絶対パス、もしくは相対パスを引数とします。
modeには、ファイルを開く際のモード(読み取り専用、書き込み用、追記用などなど)を指定することができます。
modeについては次の記事で扱います。

また、開いたファイルオブジェクトはそのまま放置しておくとそのプログラム内で使用中であると判断されてしまう
場合があり、他のプログラムが同じファイルを使おうとした際に働きを阻害してしまう場合があります。
なので、開いたファイルは閉じておく必要があります。閉じる際はclose関数を用います。

実際にファイルを読み込んでみましょう。
事前に以下のようなファイルを用意しておいて、そのファイルを開いてみます。

sample.txt

Hello Python!

YAH YAH YAH

Goodbye Python

テキストファイルは、Pythonの.pyファイルと同じディレクトリに置いておきましょう。
では、以下のようにファイルを開いてみます。

file1 = open("sample.txt")
file1.close()

open関数の引数は上で書いたとおり、ファイル名をとります。
もう一つの引数であるmodeについては省略可能であり、省略した場合は読み取り専用としてファイルを開きます。
ただし、上記のコードでは実行してもファイル内容を表示したりすることはできません。
open関数で指定したファイルは、ファイルオブジェクトとしてプログラム上で扱われます。
次にファイルオブジェクトについてみていきましょう。

ファイルオブジェクトについて

openで開いたファイルは、ファイルオブジェクトとしてプログラム上に読み込まれます。
ファイルオブジェクトは、読み込んだテキストファイルの内容を改行コードで各行が区切られた文字列として扱います。
例えば、sample.txtの場合は以下のような文字列として扱います。

Hello Python!\n    ///1行目
(空行)         ///2行目
YAH YAH YAH\n    ///3行目
(空行)         ///4行目
Goodbye Python    ///5行目

ファイルオブジェクトは、そのままでは読み込んだファイルの内容を取り出すことはできません。
ファイルオブジェクトの内容を読み取る際は、readメソッドやreadlineメソッドを使います。
少々ややこしいのですが、readメソッドなどで内容を読み取る際に重要なのが
「ファイル位置」「ファイルポインタ」
などと呼ばれる、現在ファイル内のどの位置まで読み取ったかを示す情報です。
これは、ファイルオブジェクトを取得した際はファイルの先頭を示しており、
readメソッドなどを使うたびにその位置が移動していきます。
ファイル位置は、ファイルオブジェクトが管理しています。

後ほど一つずつみていきますが、readメソッドはテキストファイルの内容全体を、
readlineメソッドは1行ずつ読み込むので、ファイル位置はそれに応じて動いていきます。

では、実際にテキストファイルを開いて内容を読み取ってみましょう。

file1 = open("sample.txt")

lines = file1.read()          ### file1の内容をreadで読み込み、linesに代入している

print(lines)

file1.close()
C:\Python> python 9-14_1.py
Hello Python!

YAH YAH YAH

Goodbye Python

このように、readメソッドではファイルオブジェクトの内容を全て取得することができます。
readメソッドを含め、ファイルオブジェクトには内容を取得するためのメソッドが3つ用意されています。


ファイルオブジェクトの内容を読み込むメソッド

ファイルオブジェクトの内容を読み込むには、以下の3つのメソッドを用います。

  • readメソッド
  • readlineメソッド
  • readlinesメソッド

readメソッド

readメソッドは、ファイルオブジェクトの内容を全て読み込んで1つの文字列として返します。
複数行に渡る内容の場合は、改行コードを含む1つの文字列として扱います。

以下は先程紹介した内容と同じものになります。

file1 = open("sample.txt")

lines = file1.read()        ### file1の内容をreadで読み込み、linesに代入している

print(lines)

print("--------------------")
print(type(lines))          ### type関数でlinesを確認する

file1.close()
C:\Python> python 14-2.py
Hello Python!

YAH YAH YAH

Goodbye Python
——————–
<class ‘str’>

printで出力した内容をみると、変数linesの中にsample.txtの内容が読み込まれているのがわかります。
また、type関数の結果から、文字列として扱われているのも確認できたかと思います。

readlineメソッド

次にreadlineメソッドは、ファイルの内容から1行読み込んで文字列として返します。
readlineメソッドの場合1行ずつ読み込んでいくため、読み込むたびにファイル位置が移動していきます。

file1 = open("sample.txt")

line1 = file1.readline()        ### file1の内容を1行分読み込み、line1に代入している
line2 = file1.readline()
line3 = file1.readline()

print("1行目:" + line1)
print("--------------------")

print("2行目:" + line2)
print("--------------------")

print("3行目:" + line3)

file1.close()
C:\Python> python 14-3.py
1行目:Hello Python!

——————–
2行目:

——————–
3行目:YAH YAH YAH

2行目が空白行のため少し分かりづらいかもしれませんが、line1~3それぞれに対して1行目、2行目、3行目が
読み込まれているのがわかると思います。
なお、各行の後ろが1行空いているのは、readlineで読み取った際、各行の末尾にある改行コードも含めて
読み取って、line1~3に文字列として与えているためになります。
これは、次のreadlinesメソッドで読み取った内容をみるとわかります。

readlinesメソッド

readlinesメソッドは、ファイルの内容からすべて読み込みます。
これだけだとreadメソッドと同じですが、readlinesは読み取った内容を1つの文字列として扱うのではなく、
改行コードで分かれた各行を要素とするリストを返します。

file1 = open("sample.txt")

lines = file1.readlines()   ### file1の内容をreadlinesで読み込み、linesに代入している

print(lines)

print("--------------------")
print(type(lines))          ### type関数でlinesを確認する

file1.close()
C:\Python> python 14-3.py
[‘Hello Python!\n’, ‘\n’, ‘YAH YAH YAH\n’, ‘\n’, ‘Goodbye Python’]

——————–
<class ‘list’>

readメソッドのときと異なり、読み取った内容がリストに収まっています。
各要素をみてみると、テキストファイルの各行が1要素として扱われているのが確認できます。
また、その1要素の末尾を見ると、改行コードである”\n”が入っているのも見えるでしょう。
先程紹介したreadlineメソッドでは、各行の末尾に”\n”が入った状態で1行ずつ読み込んでいます。
Pythonでは”\n”や”\r\n”を改行コードとして扱うため、改行コードを含んだ行を読み込んだ場合
“\n”を末尾に含んだ要素になります。

また、readlinesメソッドはリストが返るため、以下のようにリストのインデックスを指定すれば任意の行を
読み取ることもできます。

file1 = open("sample.txt")

lines = file1.readlines()

print(lines)

print("--------------------")

print(lines[2])

file1.close()
[‘Hello Python!\n’, ‘\n’, ‘YAH YAH YAH\n’, ‘\n’, ‘Goodbye Python’]

——————–
YAH YAH YAH

ちなみに、改行コードを取り除きたい場合は各行に対してstripメソッドを使うと取り除けます。
stripメソッドは文字列の先頭と末尾の指定した文字を削除するメソッドで、デフォルトでは
空白文字(改行コードや全角スペース、タブなどを含む)が取り除かれます。

file1 = open("sample.txt")

lines = file1.readlines()
s_lines = [line.strip() for line in lines]

print(s_lines)

file1.close()
C:\Python> python 14-3.py
[‘Hello Python!’, ”, ‘YAH YAH YAH’, ”, ‘Goodbye Python’]

readlinesで読み取ったリストにリスト内包表記でstripメソッドを適用し、改行コードを含まない
新たなリストを作成しました。

なお、openで取得できるファイルオブジェクトはイテラブルなオブジェクトですので
そのままfor文で1行ずつ取り出すこともできます。

file1 = open("sample.txt")

for i,line in enumerate(file1):
	print(f'{i}行目:{line}')

file1.close()
C:\Python> python 14-3.py
0行目:Hello Python!

1行目:

2行目:YAH YAH YAH

3行目:

4行目:Goodbye Python

ファイルオブジェクトの全ての行に対して処理をするような場合は、こちらのほうが簡単かもしれませんね。

まとめ

・Pythonでファイルを用いる際はopen関数を用いる
・open関数で開いたファイルは、ファイルオブジェクトと呼ばれるオブジェクトになる
・ファイルオブジェクトの内容は、read / readline / readlinesメソッドで読み取ることができる


確認問題

以下の選択肢から、正しいものを選んでください。
1.open関数の引数には、ファイル名を指定する。
2.open関数で開いたファイルは、ファイルオブジェクトとして扱われる。
3.readメソッドは、開いたファイルの1行目を読み取るメソッドである。
4.readlinesメソッドで返る値は文字列である。

答えはこちらの記事の最後に!
【Python連載】with~as構文を使ったファイルの操作

連載目次

独学で学ぶ Pythonプログラミング 連載目次