【Python】テキストファイルの読み込み(モードr, rt)【入門第56回】
目次
- テキストファイルの読み込み
- テキストファイルを開く
read
メソッドでファイルの内容を全て読み込むread
メソッドでn文字ずつ読み込むreadlines
メソッドで全行を読み込むreadline
メソッドで1行ずつ読み込む- おわりに
- 関連動画
テキストファイルの読み込み
こんにちは、narupoです。
今回はPythonでテキストファイルの内容を読み込む方法を解説します。
テキストファイルを読み込むにはまずopen
関数でファイルを開きます。
ファイルを開いてファイルオブジェクトを手に入れたら、ファイルオブジェクトのメソッドを使ってファイルの内容を読み込みます。
テキストファイルについて、具体的には↓を見ていきます。
テキストファイルを開く
readメソッドでファイルの内容を全部読み込む
readメソッドでn文字ずつ読み込む
readlinesメソッドで全行を読み込む
readlineメソッドで1行ずつ読み込む
ほかのファイル入出力についての入門記事は↓をご覧ください。
- 【Python】ファイルを開いて閉じる。open関数の使い方【入門第54回】
- 【Python】テキストファイルの読み込み(モードr, rt)【入門第55回】
- 【Python】テキストファイルへの書き込み(モードw, wt)【入門第56回】
- 【Python】テキストファイルへの追記(モードa, at)【入門第57回】
- 【Python】テキストファイルを排他的に開いて書き込む(モードx, xt)【入門第58回】
- 【Python】バイナリファイルの読み込み(モードrb)【入門第59回】
- 【Python】バイナリファイルへの書き込み(モードwb)【入門第60回】
- 【Python】バイナリファイルへの追記(モードab)【入門第61回】
- 【Python】バイナリファイルを排他的に開いて書き込む(モードxb)【入門第62回】
- 【Python】テキストファイルを読み書きモードで開く(モードr+, r+t)【入門第63回】
- 【Python】テキストファイルを読み書きモードで新規作成して開く(モードw+, w+t)【入門第64回】
- 【Python】テキストファイルを読み書きモードで、新規作成して、排他的に開く(モードx+, x+t)【入門第65回】
- 【Python】バイナリファイルを読み書きモードで開く(モードr+b)【入門第66回】
- 【Python】バイナリファイルを読み書きモードで新規作成して開く(モードw+b)【入門第67回】
- 【Python】バイナリファイルを読み書きモードで排他的に開く(モードx+b)【入門第68回】
- 【Python】テキストファイルを読み書きモードで追記する(モードa+)【入門第69回】
- 【Python】バイナリファイルを読み書きモードで追記する(モードa+b)【入門第70回】
- 【Python】バイナリファイルのランダムアクセスの基本・前編【入門第71回】
- 【Python】バイナリファイルのランダムアクセスの基本・後編【入門第72回】
- 【Python】ランダムアクセスによる固定長レコードの読み書き・前編【入門第73回】
テキストファイルを開く
今回は↓のような内容のテキストファイル、foods.txt
を例にして解説します。
:::text
肉まん
あんまん
豚まん
テキストファイルを開くにはopen
関数を使います。
open
関数の詳しい使い方については↓の記事をご覧ください。
↓のようにするとutf-8
で保存されたテキストファイルを開くことが出来ます。
:::python
with open('foods.txt', encoding='utf-8') as fin:
pass
open
関数はデフォルトではテキストファイルの読み込みモードでファイルを開きます。
モードを明示的に指定したい場合は↓のようにします。
:::python
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 ... 同上
r
はread
の略で、rt
はread text
の略です。
rt
のt
は省略できます。
encoding
引数にはファイルのエンコーディングを指定します。
ファイルがutf-8
で保存されている場合はencoding='utf-8'
のように指定します。
cp932
であればencoding='cp932'
です。
Windows環境のPythonはデフォルトではcp932
のエンコーディングでファイルを開こうとします。
Linux系ではutf-8
です。
エンコーディングの詳しい説明については↓の記事をご覧ください。
fin
というのがファイルオブジェクトです。
このファイルオブジェクトを操作してファイルの内容を読み込みます。
read
メソッドでファイルの内容を全て読み込む
read
メソッドを使うとファイルの内容を全て読み込むことが出来ます。
:::python
with open('foods.txt', encoding='utf-8') as fin:
content = fin.read()
print(content)
↑のコードの実行結果は↓のようになります。
肉まん
あんまん
豚まん
read
メソッドは一度実行するとファイルオブジェクト内部のオフセット位置をファイル末尾まで移動します。
なので↓のように2回呼び出すと、2回目のread
の結果は空になります。
:::python
with open('foods.txt', encoding='utf-8') as fin:
content = fin.read()
print('[' + content + ']')
content = fin.read()
print('[' + content + ']')
[肉まん
あんまん
豚まん
]
[]
オフセット位置とは、ファイルを操作するための起点となる位置です。
ファイルオブジェクトは内部にこのオフセット位置を持っています。
ファイルの操作では基本的に、このオフセット位置を操作してファイルを読み込んだり書き込んだりします。
これについてはランダムアクセスの記事で詳しく解説する予定です。
read
メソッドでn文字ずつ読み込む
read
メソッドの第1引数に読み込みたい文字の長さを指定すると、その分だけ読み込むことが出来ます。
たとえばファイルから1文字だけ読み込みたい場合は↓のようにします。
:::python
with open('foods.txt', encoding='utf-8') as fin:
ch = fin.read(1)
print(ch)
↑のコードの実行結果は↓のようになります。
肉
3文字読み込みたい場合は↓です。
:::python
with open('foods.txt', encoding='utf-8') as fin:
ch = fin.read(3)
print(ch)
↑のコードの実行結果は↓のようになります。
肉まん
read
メソッドはファイルの終わり(EOF
... End Of File
と言う)に達すると空文字列を返します。
これを利用してwhile
文を使ってファイルの内容を終端まで1文字ずつ読み込むことが出来ます。
:::python
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
メソッドは呼び出すとリストを返します。
:::python
with open('foods.txt', encoding='utf-8') as fin:
lines = fin.readlines()
print(lines)
↑のコードの実行結果は↓のようになります。
['肉まん\n', 'あんまん\n', '豚まん\n']
↑を見るとわかりますが、文字列のおしりに\n
という文字が付いていますね。
これは\
とn
で1つの文字で、改行を表す制御文字です。
改行と言うのは、エディタでエンターキーを押すと行が増えますね。あれは改行が入力されているんです。
たとえば↓のように文字列を書くと、\n
のところで改行されるわけです。
:::python
'ねこ\nいぬ\nうさぎ\n'
readlines
メソッドはこの改行をそのままにして読み込みます。
ですので↓のようにしてリストをfor
文で回すと、
:::python
with open('foods.txt', encoding='utf-8') as fin:
for line in fin.readlines():
print(line)
↓のように余分な改行が付いてしまいます。
:::text
肉まん
あんまん
豚まん
これを何とかするにはprint
関数のend
引数に空文字列を指定します。
:::python
with open('foods.txt', encoding='utf-8') as fin:
for line in fin.readlines():
print(line, end='')
↑のコードの実行結果は↓のようになります。
:::text
肉まん
あんまん
豚まん
あるいは文字列のrstrip
メソッドを使って末尾の改行を削除します。
:::python
with open('foods.txt', encoding='utf-8') as fin:
for line in fin.readlines():
print(line.rstrip('\n'))
↑のコードの実行結果は↓のようになります。
:::text
肉まん
あんまん
豚まん
また、ファイルオブジェクト自体をfor
文で回すと、行を読み込むことが出来ます。
↓は↑のコードと同じ結果になります。
:::python
with open('foods.txt', encoding='utf-8') as fin:
for line in fin:
print(line.rstrip('\n'))
readline
メソッドで1行ずつ読み込む
readline
メソッドを使うと、ファイルから1行ずつ読み込むことが出来るようになります。
:::python
with open('foods.txt', encoding='utf-8') as fin:
line = fin.readline()
print(line)
↑のコードの実行結果は↓のようになります。
肉まん
readline
メソッドもオフセット位置がファイルの末尾に達した場合は空文字列を返します。
これを利用して↓のようにファイルの内容を1行ずつすべて読み込むことが出来ます。
:::python
with open('foods.txt', encoding='utf-8') as fin:
while True:
line = fin.readline()
if not len(line):
break
print(line)
↑のコードの実行結果は↓のようになります。
:::text
肉まん
あんまん
豚まん
readline
メソッドも改行も含めて読み込むので、改行を取り去りたい場合は↓のようにrstrip
などを使います。
:::python
with open('foods.txt', encoding='utf-8') as fin:
while True:
line = fin.readline()
if not len(line):
break
print(line.rstrip('\n'))
↑のコードの実行結果は↓のようになります。
:::text
肉まん
あんまん
豚まん
おわりに
テキストファイルの読み込みができるようになると、ファイルに保存したデータをプログラムで利用できるようになります。
たとえば日記帳などを作って、その日記帳からデータを読み込んでいろいろ計算するとかも可能になるわけですね。
このようにファイル入出力が出来るようになると、プログラミングの幅が広がります。
ファイル入出力は最初はむずかしくて敬遠しがちですが、慣れると非常に便利なものです。
以上、次回に続きます。
また見てね