Python ファイルの読み書き

PythonBeginner
オンラインで実践に進む

はじめに

この実験(Lab)では、Python におけるファイルの読み書きの基本的なプロセスを学習します。ファイル I/O(入出力)は、プログラムがデータを永続化したり、設定を読み込んだり、ファイルシステムと対話したりするために不可欠なスキルです。

ここでは、Python でファイルを扱うための現代的で推奨される方法である with ステートメントの使用に焦点を当てます。これにより、エラーが発生した場合でもファイルが自動的に閉じられ、リソースのリークを防ぎます。

この実験を通して、以下のことを行います。

  • 基本的なファイル I/O プロセスを理解する。
  • 異なるメソッド(read()、readlines()、およびイテレーション)を使用してファイルを開き、読み込む。
  • ファイルに新しいコンテンツを書き込んだり、既存のファイルにコンテンツを追記したりする。

すべての操作は LabEx WebIDE 内で実行されます。それでは始めましょう。

ファイル読み書きのプロセス

このステップでは、Python におけるファイル I/O の基本的なプロセスと、withステートメントがなぜ不可欠なのかを学びます。

Python でファイルから読み書きを行うには、通常、以下の 3 つのステップを踏みます。

  1. ファイルを開く。
  2. ファイルへの読み書きを行う。
  3. ファイルを閉じる。

ファイルのクローズを手動で管理すると、エラーが発生しやすくなります。ファイルが開いている間にプログラムでエラーが発生した場合、適切に閉じられない可能性があります。これを解決するために、Python はwithステートメントを提供します。これは、例外が発生した場合でも、ファイルのクローズを自動的に処理し、システムリソースが正しく管理されることを保証します。

注記: WebIDE(VS Code のようなもの)の使用に慣れていない場合は、まずこちらの実験(lab)で学習してください。

基本的な構文は次のとおりです。

with open('filename.txt', 'mode') as file_variable:
    ## ファイルに対する操作を実行
  • open(): ファイルを開くための組み込み関数。
  • 'filename.txt': ファイルへのパス。
  • 'mode': ファイルの使用方法を示す文字(例:読み取りの場合は'r'、書き込みの場合は'w')。
  • file_variable: ファイルオブジェクトとのやり取りに使用する変数。

このステップは純粋に概念的なものです。次のステップでは、この知識を適用して実際のファイル操作を実行します。

ファイルのオープンと読み取り

このステップでは、open() 関数を使用してファイルをどのように開き、読み取るかを学びます。ファイル全体を読み込む方法、行ごとにリストとして読み込む方法、そして大規模なファイルに対して非常に効率的な行ごとのイテレーション(反復処理)について説明します。

セットアップスクリプトは、すでに hi.txt と sonnet29.txt の 2 つのファイルを作成しています。

read() を使用してファイル全体を読み取る

read() メソッドは、ファイルの内容全体を単一の文字列として読み取ります。

  1. 左側のファイルエクスプローラーで、read_file.py ファイルを開きます。
  2. 以下のコードをファイルに追加します。このスクリプトは hi.txt を開き、その内容を読み取り、コンソールに出力します。
## 'with' ステートメントを使用してファイルを読み取る:完了時に自動的にファイルが閉じられる
with open('/home/labex/project/hi.txt') as hello_file:
    hello_content = hello_file.read()  ## ファイル内容全体を読み込む

print(hello_content)
  1. スクリプトを実行するには、ターミナルを開き、次のコマンドを実行します。
python3 read_file.py

hi.txt の内容が出力されるはずです。

Hello World!

readlines() を使用してファイルを 1 行ずつのリストとして読み取る

readlines() メソッドは、ファイルからすべての行を読み取り、それらを文字列のリストとして返します。リスト内の各文字列は 1 行を表し、末尾に改行文字 \n を含みます。

  1. sonnet29.txt を読み取るために、read_file.py を次のコードで変更します。
## readlines() メソッド:各行を 1 つの文字列として含むリストを返す
with open('/home/labex/project/sonnet29.txt') as sonnet_file:
    lines = sonnet_file.readlines()  ## 各行を文字列として含むリストを返す

print(lines)
  1. スクリプトを再度実行します。
python3 read_file.py

出力は文字列のリストになり、各文字列がファイルからの 1 行になります。

['When, in disgrace with fortune and men\'s eyes,\n', 'I all alone beweep my outcast state,\n', 'And trouble deaf heaven with my bootless cries,\n', 'And look upon myself and curse my fate,\n']

ファイルを 1 行ずつイテレート(反復処理)する

大規模なファイルの場合、ファイル全体の内容をメモリに読み込むのは非効率的になることがあります。より良いアプローチは、ファイルオブジェクトを直接イテレートすることです。これにより、ファイル全体をメモリにロードすることなく、1 行ずつファイルを読み取ります。

  1. read_file.py を最後に以下のコードで変更します。
## 1 行ずつファイルをイテレートする (大規模ファイルに対してメモリ効率が良い)
with open('/home/labex/project/sonnet29.txt') as sonnet_file:
    for line in sonnet_file:  ## ファイルオブジェクトはイテラブルである
        print(line, end='')  ## 余分な改行なしで出力する

注:ファイルからの各 line にはすでに改行が含まれているため、余分な改行が追加されるのを防ぐために、print() 関数で end='' を使用します。

  1. スクリプトを実行します。
python3 read_file.py

これにより、ファイルの内容が完全に整形されて出力されます。

When, in disgrace with fortune and men's eyes,
I all alone beweep my outcast state,
And trouble deaf heaven with my bootless cries,
And look upon myself and curse my fate,

ファイルへの書き込み

このステップでは、データファイルをどのように書き込むかを探索します。既存のコンテンツを上書きする書き込みモード ('w') と、ファイルの末尾に新しいデータを追加する追記モード ('a') の 2 つの異なるモードについて説明します。

'w' モードを使用したファイルへの書き込み

ファイルを書き込みモード ('w') で開くと、ファイルが存在しない場合は新しいファイルが作成されます。ファイルが既に存在する場合、新しいコンテンツが書き込まれる前に、その全コンテンツは消去されます。

  1. ファイルエクスプローラーで、write_file.py ファイルを開きます。
  2. 以下のコードを追加します。このスクリプトは bacon.txt という名前のファイルを作成し、1 行のテキストを書き込みます。write() メソッドは書き込まれた文字数を返します。
## ファイルへの書き込み:'w' モードは既存のファイルを上書きする
with open('/home/labex/project/bacon.txt', 'w') as bacon_file:  ## 'w' = 書き込みモード
    chars_written = bacon_file.write('Hello world!\n')  ## 書き込まれた文字数を返す

print(chars_written)
  1. ターミナルからスクリプトを実行します。
python3 write_file.py

出力には、ファイルに書き込まれた文字数が表示されます。

13

これで、ファイルエクスプローラーに新しいファイル bacon.txt が表示されます。

'a' モードを使用したファイルへの追記

追記モード ('a') は、既存のコンテンツを削除せずに、ファイルの末尾にデータを追加するために使用されます。ファイルが存在しない場合は作成されます。

  1. write_file.py を変更して、bacon.txt に別の行を追記します。
## ファイルへの追記:'a' モードは既存のファイルに追記する
with open('/home/labex/project/bacon.txt', 'a') as bacon_file:  ## 'a' = 追記モード
    chars_written = bacon_file.write('Bacon is not a vegetable.')

print(chars_written)
  1. スクリプトを再度実行します。
python3 write_file.py

出力には、新しい文字列からの文字数が表示されます。

25

最終的な内容の確認

書き込み操作と追記操作が正しく機能したことを確認するために、bacon.txt の内容を読み取ってみましょう。

  1. write_file.py を最後に変更し、bacon.txt の内容を読み取って出力するようにします。
with open('/home/labex/project/bacon.txt') as bacon_file:
    content = bacon_file.read()

print(content)
  1. スクリプトを実行します。
python3 write_file.py

出力には、書き込み操作と追記操作の両方からの結合された内容が表示されるはずです。

Hello world!
Bacon is not a vegetable.

まとめ

Python でのファイルの読み書きに関するこの実験(Lab)を完了されたことをお祝いします!

この実験(Lab)では、ファイル I/O(入出力)の必須スキルを学びました。まず、安全かつ自動的なファイル処理のための with ステートメントの重要性を理解することから始めました。

次に、ファイルを読み取るためのいくつかの方法を練習しました。

  • ファイル全体を単一の文字列として取得するための read()。
  • すべての行のリストを取得するための readlines()。
  • 大規模なファイルを効率的に 1 行ずつ処理するための、ファイルオブジェクトを直接イテレートする方法。

最後に、ファイルへの書き込み方法を探りました。

  • 新しいファイルを作成したり、既存のファイルを上書きしたりするための書き込みモード ('w') の使用。
  • 以前のデータを消去せずにファイル末尾にコンテンツを追加するための追記モード ('a') の使用。

これらの基本的な操作は、データを保存したり、設定を読み込んだり、テキストファイルを処理したりする必要がある、より複雑なアプリケーションの構成要素となります。