Pythonのテキストファイルの読み込み方法
目次
- Pythonでテキストファイルを読み込む
- テキストファイルを読み込む全体の流れ
- テキストファイルを開く
- ファイルオブジェクトの正体
- read()で内容を読み込む
- readlines()で行全体を読み込む
- readline()で1行ずつ読み込む
- おわりに
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引数に指定できるオプションのことで、これはファイルを開く方法を指定するものです。
モードがr
かrt
のどちらかであれば、open()
は第1引数に指定されたパスをテキストファイルとして開きます。
r
とrt
のr
はread
, t
はtext
です。
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引数のモードにr
やrt
を指定した場合、開かれるファイルオブジェクトのタイプはio.TextIOWrapper
になっています。
with open('file.txt', 'r') as fin: print(type(fin))
↑の結果は↓になります。
<class '_io.TextIOWrapper'>
このファイルオブジェクトの公式ドキュメントは↓になります。
TextIOWrapper
はBufferedIOBase
を継承しています。
BufferedIOBase
はIOBase
を継承しています。
つまりTextIOWrapper
はBufferedIOBase
とIOBase
のメソッドを使えるということになります。
よく使われるメソッドは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.txt
をreadline()
で読み込む場合は↓のようなコードを書きます。
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によるテキストファイルの読み込み方法について見てみました。
テキストファイルの読み込みはプログラミングでは頻繁に使うのでぜひ覚えておきたい技術です。
(^ _ ^) | テキストとバイナリどっちが好き? |
(・ v ・) | ドロー! |