Pythonのテキストファイルの読み込み方法

233, 2021-04-21

目次

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

Pythonでテキストファイルを読み込むにはファイルを開き、ファイルオブジェクトのメソッドを使用します。
テキストファイルを読み込むことでファイルの内容を文字列やリストで取得することができます。

結論から言うとテキストファイルは↓のように読み込みます。

with open('file.txt', 'r') as fin:
    content = fin.read()

print(content)

↑の例ではファイル「file.txt」の内容をread()ですべて読み込み、print()でその内容を出力しています。
その他の例についても詳しく見ていきます。
今回は具体的には↓を見ていきます。

  • テキストファイルを読み込む全体の流れ

  • テキストファイルを開く

  • ファイルオブジェクトの正体

  • read()で内容を読み込む

  • readlines()で行全体を読み込む

  • readline()で1行ずつ読み込む

テキストファイルを読み込む全体の流れ

Pythonでテキストファイルを読み込むことについてその全体像を最初に解説します。

まずPythonではテキストファイルは組み込み関数のopen()で開きます。
そしてopen()でファイルを開いたらファイルオブジェクトを取得できるので、このファイルオブジェクトのメソッドを使用してファイルの読み込み/書き込みを行います。
メソッドでファイルの内容を取得したら、その内容を加工するなどして自由に出力等します。

これがPythonにおけるテキストファイルの読み込みの流れです。
ファイルオブジェクトのメソッドは複数あり、ケースに合わせて使い分ける必要があります。
この記事では代表的なメソッドについて解説します。

テキストファイルを開く

テキストファイルを開くにはopen()を使いますが、この時に指定するモードは「r」か「rt」のどちらかです。
モードとはopen()の第2引数に指定できるオプションのことで、これはファイルを開く方法を指定するものです。
モードがrrtのどちらかであれば、open()は第1引数に指定されたパスをテキストファイルとして開きます。
rrtrread, ttextです。

fin = open('file.txt', 'r')

open()は↑のようにファイルを開くことに成功するとファイルオブジェクトを返り値として返します。
このファイルオブジェクトを通じてファイルのデータをやり取りします。
ファイルは開いたら閉じるのがマナーになっています。理由は、リソースの占有などを防ぐためです。
閉じるにはファイルオブジェクトのclose()メソッドを使います。

fin.close()

この

  • ファイルを開く

  • ファイルを閉じる

という一連の決まりごとは自動化することができます。
自動化するにはwith文を使います。

with open('file.txt', 'r') as fin:
    pass

↑のようにwithでファイルを開くと、withのブロックが終了した時点でfinは自動的にクローズされます。
ファイルの閉じ忘れを防ぎたい場合はopen()を使う時にwithも合わせる癖を作ると良いかもしれません。

また、Windows環境でUTF-8のテキストファイルを開きたい場合はencodingを指定するようにします。

with open('file.txt', 'r', encoding='utf-8') as fin:
    pass

Windows環境ではデフォルトの文字コードがcp932になっているため、open()もその文字コードでファイルを開こうとします。
そのためUTF-8のテキストファイルをencoding指定なしで開こうとすると失敗します。

ファイルオブジェクトの正体

open()の第2引数のモードにrrtを指定した場合、開かれるファイルオブジェクトのタイプはio.TextIOWrapperになっています。

with open('file.txt', 'r') as fin:
    print(type(fin))

↑の結果は↓になります。

<class '_io.TextIOWrapper'>

このファイルオブジェクトの公式ドキュメントは↓になります。

TextIOWrapperBufferedIOBaseを継承しています。

BufferedIOBaseIOBaseを継承しています。

つまりTextIOWrapperBufferedIOBaseIOBaseのメソッドを使えるということになります。
よく使われるメソッドはread(), readlines(), readline()などです。

read()で内容を読み込む

read()はファイルオブジェクトを通じてテキストファイルの中身を読み込むメソッドです。
第1引数には読み込みたいバイト数を指定します。
第1引数に何も指定しない場合はEOFに到達するか読み込みがブロックされるまでファイルを読み込みます。

↓のようなファイル「file.txt」があったとして、

1234
abcd

上記のファイルをread()で読み込むと↓のようなコードになります。

with open('file.txt', 'r') as fin:
    content = fin.read()

print(content)

↑の結果は↓になります。

1234
abcd

read()の第1引数に読み込みたいバイト数を指定した場合は、そのバイト数だけ読み込みます。
たとえば4バイトだけ読み込みたければ↓のようにします。

with open('file.txt', 'r') as fin:
    content = fin.read(4)

print(content)

↑の結果は↓になります。

1234

この例では常にファイルの先頭から4バイト分読み込んでいますが、好きな位置から好きなバイト数だけ読み込みたいという場合は「ランダムアクセス」という技術が必要になります。
バイナリファイルのランダムアクセスについては↓の記事をご覧ください。

readlines()で行全体を読み込む

readlines()はテキストファイル全体の行をリストとして読み込むメソッドです。
第1引数には読み込みたい行数を指定することができます。
第1引数を指定しない場合はすべての行を読み込みます。

さきほどのfile.txtの中身を行のリストとして取得するには↓のようにコードを書きます。

with open('file.txt', 'r') as fin:
    lines = fin.readlines()

print(lines)

結果は↓になります。

['1234\n', 'abcd\n']

各行の行末の改行が除去されていないことに注意してください。
行末の改行を除去したい場合は↓のように行をfor文やリスト内包表記などで回してrstrip()します。

with open('file.txt', 'r') as fin:
    lines = fin.readlines()

lines = [line.rstrip('\n') for line in lines]
print(lines)

↑の結果は↓になります。

['1234', 'abcd']

第1引数に読み込みたい行数を指定した場合はその行数だけ読み込みます。

with open('file.txt', 'r') as fin:
    lines = fin.readlines(1)

print(lines)
['1234\n']

readline()で1行ずつ読み込む

readline()はファイルオブジェクトから1行読み込むメソッドです。
第1引数には読み込みたいバイト数を指定します。
第1引数を指定していない場合は行を読み込みます。
ファイルの終端まで読み込んだ場合は返り値に空文字列を返します。

先ほどのfile.txtreadline()で読み込む場合は↓のようなコードを書きます。

with open('file.txt', 'r') as fin:
    line = fin.readline()
    print(f'line[{line}]')
    line = fin.readline()
    print(f'line[{line}]')
    line = fin.readline()
    print(f'line[{line}]')
line[1234
]
line[abcd
]
line[]

1行目を読み込み、ついで2行目を読み込んで、最後に空文字列を読み込んでいます。
読み込んだ行の行末の改行は除去されていないことに注意してください。

空文字列の読み込みは無限ループなどの終了条件にすることが可能です。
無限ループでファイルから1行ずつ読み込みたい場合は↓のようにします。

with open('file.txt', 'r') as fin:
    while True:
        line = fin.readline()
        if not len(line):
            break

        print(line)

おわりに

今回はPythonによるテキストファイルの読み込み方法について見てみました。
テキストファイルの読み込みはプログラミングでは頻繁に使うのでぜひ覚えておきたい技術です。

テキストとバイナリどっちが好き?

ドロー!

投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。