【Python】テキストファイルの読み込み(モードr, rt)【入門第56回】

176, 2019-09-16

目次

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

こんにちは、narupoです。

今回はPythonでテキストファイルの内容を読み込む方法を解説します。
テキストファイルを読み込むにはまずopen関数でファイルを開きます。
ファイルを開いてファイルオブジェクトを手に入れたら、ファイルオブジェクトのメソッドを使ってファイルの内容を読み込みます。

テキストファイルについて、具体的には↓を見ていきます。

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

  • readメソッドでファイルの内容を全部読み込む

  • readメソッドでn文字ずつ読み込む

  • readlinesメソッドで全行を読み込む

  • readlineメソッドで1行ずつ読み込む

ほかのファイル入出力についての入門記事は↓をご覧ください。

テキストファイルを開く

今回は↓のような内容のテキストファイル、foods.txtを例にして解説します。

肉まん
あんまん
豚まん

テキストファイルを開くにはopen関数を使います。
open関数の詳しい使い方については↓の記事をご覧ください。

↓のようにするとutf-8で保存されたテキストファイルを開くことが出来ます。

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

open関数はデフォルトではテキストファイルの読み込みモードでファイルを開きます。
モードを明示的に指定したい場合は↓のようにします。

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

with open('foods.txt', mode='rt', encoding='utf-8') as fin:
    pass

open関数のmode引数にモードの文字列を指定します。
↓がモードの意味です。

  • r ... 読み込みモードでテキストファイルを開く

  • rt ... 同上

rreadの略で、rtread textの略です。
rttは省略できます。

encoding引数にはファイルのエンコーディングを指定します。
ファイルがutf-8で保存されている場合はencoding='utf-8'のように指定します。
cp932であればencoding='cp932'です。
Windows環境のPythonはデフォルトではcp932のエンコーディングでファイルを開こうとします。
Linux系ではutf-8です。
エンコーディングの詳しい説明については↓の記事をご覧ください。

finというのがファイルオブジェクトです。
このファイルオブジェクトを操作してファイルの内容を読み込みます。

readメソッドでファイルの内容を全て読み込む

readメソッドを使うとファイルの内容を全て読み込むことが出来ます。

with open('foods.txt', encoding='utf-8') as fin:
    content = fin.read()
    print(content)

↑のコードの実行結果は↓のようになります。

肉まん
あんまん
豚まん

readメソッドは一度実行するとファイルオブジェクト内部のオフセット位置をファイル末尾まで移動します。
なので↓のように2回呼び出すと、2回目のreadの結果は空になります。

with open('foods.txt', encoding='utf-8') as fin:
    content = fin.read()
    print('[' + content + ']')

    content = fin.read()
    print('[' + content + ']')
[肉まん
あんまん
豚まん
]
[]

オフセット位置とは、ファイルを操作するための起点となる位置です。
ファイルオブジェクトは内部にこのオフセット位置を持っています。
ファイルの操作では基本的に、このオフセット位置を操作してファイルを読み込んだり書き込んだりします。
これについてはランダムアクセスの記事で詳しく解説する予定です。

readメソッドでn文字ずつ読み込む

readメソッドの第1引数に読み込みたい文字の長さを指定すると、その分だけ読み込むことが出来ます。
たとえばファイルから1文字だけ読み込みたい場合は↓のようにします。

with open('foods.txt', encoding='utf-8') as fin:
    ch = fin.read(1)
    print(ch)

↑のコードの実行結果は↓のようになります。

3文字読み込みたい場合は↓です。

with open('foods.txt', encoding='utf-8') as fin:
    ch = fin.read(3)
    print(ch)

↑のコードの実行結果は↓のようになります。

肉まん

readメソッドはファイルの終わり(EOF ... End Of Fileと言う)に達すると空文字列を返します。
これを利用してwhile文を使ってファイルの内容を終端まで1文字ずつ読み込むことが出来ます。

with open('foods.txt', encoding='utf-8') as fin:
    while True:
        ch = fin.read(1)
        if not len(ch):
            break
        print(ch)

↑のコードの実行結果は↓のようになります。

肉
ま
ん


あ
ん
ま
ん


豚
ま
ん

readlinesメソッドで全行を読み込む

ファイルの内容を全て行にして読み込みたい場合はreadlinesメソッドを使います。
readlinesメソッドは呼び出すとリストを返します。

with open('foods.txt', encoding='utf-8') as fin:
    lines = fin.readlines()
    print(lines)

↑のコードの実行結果は↓のようになります。

['肉まん\n', 'あんまん\n', '豚まん\n']

↑を見るとわかりますが、文字列のおしりに\nという文字が付いていますね。
これは\nで1つの文字で、改行を表す制御文字です。
改行と言うのは、エディタでエンターキーを押すと行が増えますね。あれは改行が入力されているんです。
たとえば↓のように文字列を書くと、\nのところで改行されるわけです。

'ねこ\nいぬ\nうさぎ\n'

readlinesメソッドはこの改行をそのままにして読み込みます。
ですので↓のようにしてリストをfor文で回すと、

with open('foods.txt', encoding='utf-8') as fin:
    for line in fin.readlines():
        print(line)

↓のように余分な改行が付いてしまいます。

肉まん

あんまん

豚まん

これを何とかするにはprint関数のend引数に空文字列を指定します。

with open('foods.txt', encoding='utf-8') as fin:
    for line in fin.readlines():
        print(line, end='')

↑のコードの実行結果は↓のようになります。

肉まん
あんまん
豚まん

あるいは文字列のrstripメソッドを使って末尾の改行を削除します。

with open('foods.txt', encoding='utf-8') as fin:
    for line in fin.readlines():
        print(line.rstrip('\n'))

↑のコードの実行結果は↓のようになります。

肉まん
あんまん
豚まん

また、ファイルオブジェクト自体をfor文で回すと、行を読み込むことが出来ます。
↓は↑のコードと同じ結果になります。

with open('foods.txt', encoding='utf-8') as fin:
    for line in fin:
        print(line.rstrip('\n'))

readlineメソッドで1行ずつ読み込む

readlineメソッドを使うと、ファイルから1行ずつ読み込むことが出来るようになります。

with open('foods.txt', encoding='utf-8') as fin:
    line = fin.readline()
    print(line)

↑のコードの実行結果は↓のようになります。

肉まん

readlineメソッドもオフセット位置がファイルの末尾に達した場合は空文字列を返します。
これを利用して↓のようにファイルの内容を1行ずつすべて読み込むことが出来ます。

with open('foods.txt', encoding='utf-8') as fin:
    while True:
        line = fin.readline()
        if not len(line):
            break
        print(line)

↑のコードの実行結果は↓のようになります。

肉まん

あんまん

豚まん

readlineメソッドも改行も含めて読み込むので、改行を取り去りたい場合は↓のようにrstripなどを使います。

with open('foods.txt', encoding='utf-8') as fin:
    while True:
        line = fin.readline()
        if not len(line):
            break
        print(line.rstrip('\n'))

↑のコードの実行結果は↓のようになります。

肉まん
あんまん
豚まん

おわりに

テキストファイルの読み込みができるようになると、ファイルに保存したデータをプログラムで利用できるようになります。
たとえば日記帳などを作って、その日記帳からデータを読み込んでいろいろ計算するとかも可能になるわけですね。
このようにファイル入出力が出来るようになると、プログラミングの幅が広がります。
ファイル入出力は最初はむずかしくて敬遠しがちですが、慣れると非常に便利なものです。

以上、次回に続きます。

また見てね

関連動画





スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク