Python テキストファイル 読み込み入門:具体的なコード例と実務での活用方法をわかりやすく解説
はじめに
Pythonでテキストファイルを読み込む機能を使うと、ログ分析やデータ処理、簡単なスクリプトの作成など、さまざまな場面で役立ちます。
企業の業務シーンでも、定期的に生成されるログを読み込んで内容をチェックしたり、大量のデータを一括で読み取りながら処理したりするときに用いられることが多いでしょう。
ファイル操作と聞くとやや難しく感じるかもしれませんが、Pythonの場合はシンプルな構文でテキストファイルを操作できます。
今回の記事では、初心者の方にも理解しやすいように基本的な構文や実務での活用例を具体的に解説していきます。
コード例もいくつか紹介しながら、実際にどうやって使うかをイメージしやすいようにまとめました。
これを読んでいただければ、プログラミング未経験の方でも「テキストファイル読み込み」に関する具体的なイメージを持てるはずです。
この記事を読むとわかること
- Pythonでテキストファイルを読み込むための基本的な構文
open
関数やwith
ステートメントを利用したコード例- 実務におけるテキストファイル読み込みの具体的な利用シーン
- 処理効率を意識したファイル操作の考え方
ここから先は、初心者の方が実際にコードを書くときに役立つように、平易な表現と例を交えながら進めます。
ぜひ最後まで読んでみてください。
Pythonでテキストファイルを扱う基本の流れ
まずはPythonでテキストファイルを扱う基本的な流れを押さえてみましょう。
一般的には次の手順で作業を行います。
- ファイルを開く
- ファイルの内容を読み込む
- ファイルを閉じる
Pythonでは open
関数を使うことで簡単にファイルを開き、読み込めます。
ただしファイルを開いたら、最後には必ず「閉じる」処理を行う必要があります。
閉じ忘れを防ぐためにも、後述する with
ステートメントを使った書き方がとても便利です。
実際の開発現場でも、この with
文による方法が推奨されることが多く、書くコードの量が減るうえに、思わぬバグを減らせるのが利点です。
そこで、まずは open
関数を使って直接ファイルを開く方法と、 with
ステートメントを使った方法を比較しながら理解していきましょう。
open関数の基本的な使い方
Pythonでファイルを開くとき、 open
関数を使います。
書式としては以下のような形になります。
file_object = open("sample.txt", "r", encoding="utf-8")
ここでは "sample.txt"
がファイルのパスを意味し、 "r"
は「読み取り専用モード」を表しています。
encoding="utf-8"
はファイルの文字コードを指定するための引数です。
日本語を含むテキストを扱う場合は、一般的にUTF-8を使うことが多いため、このように設定しておくと安心です。
ファイルを開いた後は、例えば下のようにすれば内容をまとめて読み込めます。
content = file_object.read() print(content)
この場合、ファイル全体のテキストを一度に変数 content
に格納しています。
ただし、この書き方で注意が必要なのは、大きなファイルを扱うとメモリを多く消費することです。
大量のログファイルや巨大なデータを一気に読み込むと、処理速度が落ちたり、最悪の場合にはメモリ不足に陥ったりする可能性があります。
そのため、実務ではファイルの規模に応じて読み込み方を変える工夫が必要です。
open
関数で開いた場合は、最後に file_object.close()
で明示的にファイルを閉じることを忘れないようにしましょう。
withステートメントを使ったファイル操作
ファイルを開いたら閉じる、という処理はよくある作業です。
しかし、たとえばエラーが起きた場合や例外が発生した場合に、いちいち close()
を呼び忘れないか気になってしまいますよね。
こうした心配を減らしてくれるのが with
ステートメントです。
書き方の例は次のとおりです。
with open("sample.txt", "r", encoding="utf-8") as f: content = f.read() print(content)
with
のブロック内で open
したファイルを変数 f
に代入し、それを使って処理を行います。
ブロックを抜けると自動的にファイルが閉じられる仕組みになっているため、 close()
を書く必要がありません。
実務ではこちらの方法がよく使われています。
特に大規模なプログラムや長期間動作するプログラムでは、リソース管理が徹底されないとバグの原因になることが多いのです。
with
を使う書き方はシンプルに見えますが、安全性が高くなるのが大きなポイントです。
ファイルを1行ずつ読み込む方法
テキストファイルの内容を全部一度に読み込むだけではなく、1行ごとに処理する必要がある場面も多いです。
例えばログを解析して、特定の文字列が含まれる行だけを取得したい場合や、行ごとに数値を変換して集計したい場合を考えてみましょう。
そうしたケースでは下記のように書きます。
with open("sample.txt", "r", encoding="utf-8") as f: for line in f: print(line.strip())
この方法では、ファイルオブジェクト f
はイテラブル(繰り返し処理が可能)なオブジェクトとして扱えます。
for line in f
の構文を使うだけで、ファイルの先頭行から順に line
に読み込めるわけです。
ただし、行末の改行文字(\n
)が邪魔になる場合もあるので、そのまま表示すると改行が二重になってしまうことがあります。
そのため、 strip()
メソッドで行末の空白や改行を取り除いてから出力するようにすると見た目が整います。
テキストファイルが膨大なサイズの場合でも、この方法ならメモリに大きな負荷をかけずに、一行ずつ処理できます。
ローカル環境でのログファイル解析から、サーバー上での定期的なログチェックなど、実務で活用されることも多いでしょう。
readlinesでリストとして扱う方法
行ごとに処理する別の方法として、 readlines()
を使うパターンもあります。
readlines()
を使うと、ファイルの内容を「行ごとに分割したリスト」として取得できます。
with open("sample.txt", "r", encoding="utf-8") as f: lines = f.readlines() for line in lines: print(line.strip())
readlines()
はリストで返ってくるため、後から特定の行を参照しやすくなるでしょう。
ただし、このメソッドも read()
と同じく、ファイル全体の行を一度にメモリに載せることになるので、ファイルが大きい場合には注意が必要です。
一部の業務アプリケーションでは、何百万行のテキストファイルを扱う場面も考えられます。
そうした場合は、このメソッドで大規模データを一括で読み込んでしまうと、パフォーマンスに悪影響が出るかもしれません。
こまめにファイルを分割する、あるいは先ほど紹介した for line in f
の方法でストリーム的に読み込むなどの対策を考えておくとよいでしょう。
実務でよくある活用シーン
ファイルの読み込みは、単なるプログラミング学習の一部だけではなく、実務でも多くの人が利用する重要な機能です。
以下は例として挙げられるシーンです。
ログファイルの解析
Webサーバーやアプリケーションサーバーが吐き出すログから、エラー行を抽出するなどの処理を行う。
設定ファイルの読み取り
外部のテキストファイルに書かれたパラメータを読み込み、プログラム内で使う。
データ形式のプレーンテキスト入力
CSVやTSVのような簡易フォーマットのテキストを読み込み、値を分割して利用する。
開発現場に限らず、分析用にファイルを作成しておいて、Pythonで処理して結果を出力するといったケースもあります。
いずれも初心者が最初に学ぶスクリプトとしては取り組みやすく、成果を実感しやすい部分でもあります。
エンコーディングを意識する理由
テキストファイルを扱ううえでは、エンコーディングの問題も常につきまといます。
特に日本語を含むファイルでは、UnicodeやShift-JISなど多様な文字コードが存在するので、読み込み時の文字化けを防ぐために open
関数で encoding
を指定するのが定番です。
実務でも、たとえば他チームから受け取ったファイルが異なるエンコーディングで保存されているケースや、CSVをExcelで開くときの文字コード違いでデータが乱れるケースも多々あります。
Pythonでは utf-8
を指定するケースが多いですが、もしファイルが別の文字コードで保存されているなら、適切な値に変更しなくてはなりません。
この点を意識しておくだけで、読めるはずの文字が「???」のようになってしまうトラブルを防げるでしょう。
大きなファイルを扱う際のポイント
テキストファイルが巨大化すると、読み込み時の処理効率が課題になります。
read()
や readlines()
のように一度にメモリへロードする方法は、ファイルサイズが数MB程度ならまだ許容範囲かもしれませんが、数百MBやそれ以上のサイズになると厳しくなることがあります。
そこで、数十万行以上のファイルや行数が明確に多いログファイルを扱う場合は、次のような方法が考えられます。
for line in f
構文で1行ずつストリーム処理- 必要な範囲だけ抜き出す
- 途中の状態を随時ファイルに書き出す
効率的にデータ処理をするには、読み込むファイルを分割しておき、いくつかのバッチ作業にわける方法も現場ではよく採用されています。
Pythonにはジェネレーターという仕組みもあり、大量データを段階的に処理する仕組みも構築しやすいです。
とはいえ、初心者のうちは基本的なファイル読み込みの書き方に慣れたうえで、必要に応じて対策を調べていくのがおすすめです。
withステートメントを応用して複数ファイルを扱う
実務では、複数のテキストファイルを順番に読み込むケースもあります。
たとえば、日ごとに分割されたログを集計したい場合や、カテゴリが異なる設定ファイルを一度に読み込みたい場合が想定できます。
このようなとき、複数の with
ステートメントをつなぐ方法があります。
with open("log_day1.txt", "r", encoding="utf-8") as f1, \ open("log_day2.txt", "r", encoding="utf-8") as f2: for line in f1: # day1のファイルを行ごとに処理 pass for line in f2: # day2のファイルを行ごとに処理 pass
このようにすると、2つのファイルを同時に開くことができ、それぞれに対して処理を行ったあとで、ブロック終了時に両方とも自動で閉じられます。
複数のファイルを並行して読み込む必要がある場合などに役立つ書き方です。
ただし、本当に同時並行で解析が必要なのか、単純に「ひとつずつ処理すればよい」のかを考えたうえで構造を決めてください。
シンプルに複数ファイルを順番に扱うなら、ひとつ目のファイルの処理が終わったら次のファイルに移る流れのほうが読みやすい場合もあります。
文字列の検索やフィルタリング処理
テキストファイル読み込みのもう1つの活用例として、特定の文字列を含む行を抽出する手法を紹介します。
エラーログが並んだファイルから警告行だけ取り出したい、といったケースを考えてみましょう。
with open("server.log", "r", encoding="utf-8") as f: for line in f: if "WARNING" in line: print(line.strip())
ここでは、行の中に "WARNING"
という文字が含まれているかを if "WARNING" in line:
で判定しています。
あくまで簡単な例ですが、実際の業務であれば正規表現を使って複雑な文字列パターンをマッチさせたり、抽出した結果を別ファイルに出力したりして、効率的にログ解析を行うケースも多いでしょう。
このように、テキストファイルの読み込み処理と組み合わせて文字列の条件判定を行うことで、必要な行だけを抽出するプログラムを作れます。
特にサーバーサイドの運用をしている人にとっては、エラー行をリアルタイムで監視する仕組みを作っておくと後々便利です。
CSV形式やTSV形式のファイルを読み込むとき
テキストファイルの一種として、CSVやTSVファイル(カンマ区切りやタブ区切り)を扱う場面があります。
Pythonの標準ライブラリには csv
モジュールがあり、これを使うと区切り文字に応じてデータを分割しやすくなります。
基礎としては単なるテキストファイルと同じですが、データを取り扱ううえでは以下のような点に注意するとよいでしょう。
- 区切り文字(
,
や\t
)を使って行の内容を分割する - ヘッダー行の有無を確認する
- 文字コードが適切に指定されているかを確認する
通常のテキストファイル読み込みとあわせて、CSV専用の処理フローを学んでおくと、業務でのデータ整理に役立ちます。
例えば以下のように書けば、CSVファイルを1行ずつ読み取って、リスト形式で受け取れます。
import csv with open("data.csv", "r", encoding="utf-8") as f: reader = csv.reader(f) for row in reader: # rowはリスト形式でデータを保持する print(row)
このように、区切り文字を自動で解釈してくれるので、カンマやタブなどの区切りを個別に扱う必要がなくなるのです。
単純なテキストファイル読み込みに加え、こうしたライブラリの使い方を押さえておくと、より柔軟な処理が可能になります。
パフォーマンスを意識したファイル操作の考え方
大規模なデータや頻繁な読み込み処理を想定する場合、パフォーマンスへの配慮が必要になります。
基本的には以下のような点に気をつけるとよいでしょう。
1行ずつ読み込む
read()
や readlines()
のような大量データを一度に読み込む手法を避け、 for line in f
を活用する。
必要最低限の処理を行う
ファイルを読み込んだ直後に、余計な変換やフィルタリングを行わないようにする。
外部への書き込み頻度
解析結果をファイルに書き出す場合、頻繁に小分けで書き出すのではなく、適度なバッチサイズでまとめて行う。
テキストファイルの読み込みは最初はわかりやすい処理ですが、読み込むデータ量が増えると実行速度やメモリ使用量が無視できなくなります。
開発の初期段階でファイルサイズが小さくても、将来的な拡張を考えて設計しておくと、後から慌てなくて済むでしょう。
読み込み方式の選択やエンコーディングの指定は、プロジェクトの要件やファイルの特性によって変わります。 チームでファイル形式を統一できるなら、あらかじめ合意をとっておくと扱いやすくなるでしょう。
実務でありがちなエラーを防ぐためのアドバイス
テキストファイルを扱うとき、よくあるエラーや不具合が発生する原因も整理しておきます。
ファイルパスの誤り
指定したパスが相対パスか絶対パスか混乱していると、ファイルが見つからないエラーが起こる。
文字コードの不一致
encoding="utf-8"
と書いたのに、実際はShift-JISで保存されたファイルを読み込もうとして文字化けする。
ファイル閉じ忘れ
close()
を呼び忘れて次の処理がうまくいかない、あるいは他のプログラムが同じファイルを開けない状態が続く。
改行コードの混乱
Windows系の \r\n
とUnix系の \n
が混在しているファイルを処理するときに想定外の結果になる。
こうしたトラブルを防ぐには、 with open(...) as f:
の構文を常に用いる、適切なエンコーディングを調べて設定する、といった基本を守るのが大事です。
また、エラー発生時にわかりやすいメッセージを表示する工夫をしておけば、原因を速やかに特定できる場合もあります。
まとめ
Pythonでテキストファイルを読み込む方法は、初心者にとって習得しやすい反面、意外と見落としがちのポイントも多いです。
ただし、基本の書式や注意点を押さえておけば、実務や学習で役立つ機会はたくさんあります。
ここで紹介した主なポイントを振り返ると、次のようになります。
open
関数を使うときは、with
ステートメントでファイルを自動的に閉じるのが安全- 行ごとに読み込みたい場合は
for line in f
を利用するとメモリ使用量を節約できる - 全行をまとめて扱うなら
readlines()
も便利だが、大きなファイルでは注意が必要 - 文字コードの指定や改行コードの違いに気を配らないと文字化けが起こる可能性がある
- ログファイルや設定ファイルなど、実務で使うケースを想定しておくと理解が深まる
ファイル操作はプログラムの基本的な部分でありながら、奥が深い領域でもあります。
最初はシンプルな方法を身につけ、それから自分が必要とする処理を追加で学んでいくと、スムーズにスキルアップできるのではないでしょうか。
コードを書いて実行しながら確かめると、読み込み結果がそのまま目に見えるので、学習を進めやすいでしょう。
ぜひ今回の記事を参考に、テキストファイル読み込みを実際に試してみてください。