テキストファイルを 1 行ずつ読み込む
for-in ループで 1 行ずつ処理する方法
Python の open
関数で生成したファイルオブジェクトを for-in
ループでイテレートすることで、テキストファイルを 1 行ずつ読み込むことができます。
Python 2.5 以降であれば、open
するときに、with
キーワードを使用することによって close
処理を自動化することができます。
ファイルを使用している区間が明示的になるので、この方法を使うのがオススメです。
line
には改行コードを含むので、line.rstrip('\r\n')
で末尾の改行系文字を削除しています。
別の方法としては、line
内の改行はそのままで、print(line, end='')
として出力時の改行を抑制する方法あります(Python 2.x の頃は print line,
のように最後にカンマを付ければ改行抑制できました)。
with
によってインデントが深くなってしまうのが嫌な場合は、下記のようにユーティリティ関数を用意しておくのもよいです。
def each_line(filename):
with open(filename, encoding='utf-8') as f:
for line in f:
yield line.rstrip('\r\n')
for line in each_line('input.txt'):
print(line)
readline で 1 行ずつ読み込む方法
readline
メソッドを使うと、次の 1 行を文字列として取得することができます。
ファイルの最後まで読み込み終わると、readline
は空文字列 (""
) を返します。
with open('input.txt', encoding='utf-8') as f:
while True:
line = f.readline()
if not line: break
line = line.rstrip('\r\n')
print(line)
テキストファイルのすべての行を一度に読み込む
それほど大きなテキストファイルでなければ、テキストファイル全体の内容を一度にメモリ上に読み出してしまうこともできます。
すべての行を文字列リストとして取得する
readlines
メソッドで、全ての行を文字列のリスト (list[str]
) の形で取得できます。
各要素の末尾には改行が残っています(最終行には改行は含まれていない可能性があります)。
with open('input.txt', encoding='utf-8') as f:
lines = f.readlines() #=> list[str]
print(lines)
次のようなリスト内包表記を使用して、各行の末尾の空白・改行を削除しながら、リスト形式で読み込むこともできます。
lines = [line.rstrip() for line in open('input.txt', encoding='utf-8')]
すべての行を連結して読み出す(改行文字は残す)
read
メソッドを使用すると、ファイルの内容すべてを 1 つの文字列変数に取得することができます。
with open('input.txt', encoding='utf-8') as f:
content = f.read() #=> str
print(content)
テキストファイルの内容を 1 文字ずつ処理する
テキストファイルの内容を read
メソッドで一度に読み込み、そのテキストをさらにイテレートすることで、テキストファイルの内容を 1 文字ずつ処理することができます。
次のようなユーティリティメソッドを作っておけば、1 文字ずつ処理するコードを簡単に書けるようになります。
def iter_chars(filename):
""" Reads a text file char by char. """
with open(filename, encoding='utf-8') as f:
content = f.read()
for ch in content:
yield ch
# 使用例
for ch in iter_chars('input.txt'):
print('--> ' + ch)