Python のファイルアクセスモードの違いとは?

PythonPythonBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Python のファイル処理機能は、幅広いアプリケーションにとって不可欠です。さまざまなファイルアクセスモードを理解することは、ファイルを効果的に管理および操作するために重要です。この実験(Lab)では、Python の一般的なファイルアクセスモード、それらの違い、および特定のユースケースに適したモードを選択する方法について詳しく説明します。

この実験(Lab)では、Python の基本的なファイルアクセスモードについて学び、それらの一般的なユースケースを調査し、ファイル操作に適したモードを選択する方法を理解します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python(("Python")) -.-> python/FileHandlingGroup(["File Handling"]) python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/FileHandlingGroup -.-> python/file_opening_closing("Opening and Closing Files") python/FileHandlingGroup -.-> python/file_reading_writing("Reading and Writing Files") python/FileHandlingGroup -.-> python/file_operations("File Operations") subgraph Lab Skills python/catching_exceptions -.-> lab-397713{{"Python のファイルアクセスモードの違いとは?"}} python/file_opening_closing -.-> lab-397713{{"Python のファイルアクセスモードの違いとは?"}} python/file_reading_writing -.-> lab-397713{{"Python のファイルアクセスモードの違いとは?"}} python/file_operations -.-> lab-397713{{"Python のファイルアクセスモードの違いとは?"}} end

読み取りモード ('r') の理解と実践

Python では、ファイルアクセスモードは、ファイルを開く方法と、許可される操作(読み取りや書き込みなど)を指定します。これらのモードを理解することは、効果的なファイル処理に不可欠です。組み込みの open() 関数を使用する場合、ファイルパスとオプションでモード文字列を指定します。たとえば、open('my_file.txt', 'r') は読み取り用にファイルを開きます。

一般的なモードの簡単な概要を次に示します。

  • 読み取りモード ('r'): 読み取り用に開きます(デフォルト)。ポインタは先頭にあります。ファイルが存在しない場合、FileNotFoundError を発生させます。
  • 書き込みモード ('w'): 書き込み用に開きます。ファイルが存在する場合は切り捨て(クリア)し、存在しない場合は作成します。ポインタは先頭にあります。
  • 追記モード ('a'): 書き込み用に開きます。ファイルが存在する場合はポインタを末尾に置き、存在しない場合は作成します。新しいデータは末尾に追加されます。
  • 読み取りと書き込み ('r+'): 既存のファイルを読み取りと書き込み用に開きます。ポインタは先頭にあります。
  • 書き込みと読み取り ('w+'): 書き込みと読み取り用に開きます。ファイルを切り捨てるか、作成します。ポインタは先頭にあります。
  • 追記と読み取り ('a+'): 追記と読み取り用に開きます。書き込みのためにポインタを末尾に置きます。ファイルが存在しない場合は作成します。

最も基本的なモードである読み取り ('r') で練習しましょう。このモードは、既存のファイルの内容を読み取るためだけに使用されます。ファイルポインタは先頭から始まります。'r' モードで存在しないファイルを開こうとすると、エラーが発生することに注意してください。

まず、読み取るファイルが必要です。LabEx 内の VS Code エディターを使用して、ファイルエクスプローラーで /home/labex/project ディレクトリに移動します。my_reading_file.txt という名前の新しいファイルを作成します。次の行を追加して、ファイルを保存します。

This is the first line.
This is the second line.

次に、同じディレクトリに read_example.py という名前の Python スクリプトを作成します。次のコードを追加します。これは、テキストファイルを読み取りモードで開き、その内容を読み取り、出力します。ファイルが見つからない場合に適切に処理するために、try...except ブロックを含めます。

try:
    ## ファイルを読み取りモード ('r') で開く
    with open('/home/labex/project/my_reading_file.txt', 'r') as file:
        ## ファイルの内容全体を読み取る
        content = file.read()
        print("File content:")
        print(content)
except FileNotFoundError:
    print("Error: The file my_reading_file.txt was not found.")
except Exception as e:
    print(f"An error occurred: {e}")

print("\\nFinished reading the file.")

この Python スクリプトを保存します。次に、VS Code でターミナルを開きます(Terminal > New Terminal)。pwd を実行して、正しいディレクトリにいることを確認します。/home/labex/project と表示されるはずです。

Python インタープリターを使用してスクリプトを実行します。

python read_example.py

my_reading_file.txt の内容がターミナルに出力され、その後に完了メッセージが表示されるはずです。

File content:
This is the first line.
This is the second line.

Finished reading the file.

これは、'r' モードを使用してファイルを開き、読み取ることに成功したことを示しています。

Illustration of reading a file

書き込みモード ('w') の実践

書き込みモード ('w') は、ファイルに書き込みたい場合に使用されます。注意してください。ファイルが既に存在する場合、'w' モードで開くと切り捨てられます。つまり、以前の内容はすべて消去されます。ファイルが存在しない場合、'w' モードでファイルが作成されます。このモードは、新しいファイルを作成したり、既存のファイルを最初からやり直したりする場合に最適です。

ファイルへの書き込みを試してみましょう。/home/labex/project ディレクトリに、write_example.py という名前の新しい Python ファイルを作成します。次のコードを追加します。このスクリプトは、my_writing_file.txt を書き込みモードで開き(または作成し)、2 行を書き込みます。

try:
    ## ファイルを書き込みモード ('w') で開く
    ## ファイルが存在する場合、その内容は上書きされます。
    ## ファイルが存在しない場合、ファイルが作成されます。
    with open('/home/labex/project/my_writing_file.txt', 'w') as file:
        ## ファイルにコンテンツを書き込む
        file.write("This is the first line written in write mode.\n")
        file.write("This is the second line.\n")
    print("Content successfully written to my_writing_file.txt")

except Exception as e:
    print(f"An error occurred: {e}")

print("\nFinished writing to the file.")

write_example.py スクリプトを保存します。ターミナル(引き続き /home/labex/project 内)で、スクリプトを実行します。

python write_example.py

次の確認メッセージが表示されるはずです。

Content successfully written to my_writing_file.txt

Finished writing to the file.

ファイルが作成され、正しいテキストが含まれていることを確認するには、ターミナルで cat コマンドを使用します。

cat /home/labex/project/my_writing_file.txt

出力は、スクリプトが書き込んだ内容とまったく同じであるはずです。

This is the first line written in write mode.
This is the second line.

これは、'w' モードを使用してファイルを作成または上書きし、コンテンツを書き込む方法を示しています。

追記モード ('a') の実践

書き込みモード ('w') とは異なり、追記モード ('a') は、既存のファイルの現在の内容を削除せずに、ファイルの末尾にコンテンツを追加するために使用されます。ファイルが存在しない場合、'a' モードでファイルが作成されます。ファイルポインタは、開いたときにファイルの末尾に自動的に配置されるため、write() 操作はデータを追記します。

前の手順で作成した my_writing_file.txt にいくつかの行を追記してみましょう。/home/labex/projectappend_example.py という名前の新しい Python スクリプトを作成し、次のコードを追加します。

try:
    ## ファイルを追記モード ('a') で開く
    ## ファイルが存在する場合、新しいコンテンツが末尾に追加されます。
    ## ファイルが存在しない場合、ファイルが作成されます。
    with open('/home/labex/project/my_writing_file.txt', 'a') as file:
        ## ファイルにコンテンツを追記する
        file.write("This line is appended.\n")
        file.write("Another line is appended.\n")
    print("Content successfully appended to my_writing_file.txt")

except Exception as e:
    print(f"An error occurred: {e}")

print("\nFinished appending to the file.")

このスクリプトを保存します。次に、ターミナルから実行します。

python append_example.py

スクリプトは追記操作を確認します。

Content successfully appended to my_writing_file.txt

Finished appending to the file.

結果を確認するには、cat を再度使用してファイル全体を表示します。

cat /home/labex/project/my_writing_file.txt

元の 2 行の後に、新しく追記された 2 行が表示されるはずです。

This is the first line written in write mode.
This is the second line.
This line is appended.
Another line is appended.

追記モードは、ログエントリの追加や、以前のデータを失うことなくデータファイルに新しいレコードを追加するなどのタスクに非常に役立ちます。

読み書きモードの実践と適切なモードの選択

Python には、同じ open() コンテキスト内で読み取りと書き込みの両方を可能にするモードも用意されています。これらはより柔軟性を提供しますが、ファイルポインタの慎重な取り扱いが必要です。

  • 読み書き ('r+'): 既存のファイルを読み取りと書き込みの両方で開きます。ポインタは先頭から始まります。書き込みは、ポインタの位置から既存のコンテンツを上書きします。
  • 書き込みと読み取り ('w+'): 書き込みと読み取りのためにファイルを開きます。ファイルが存在する場合は切り捨て、存在しない場合は作成します。ポインタは先頭から始まります。
  • 追記と読み取り ('a+'): 追記(末尾への書き込み)と読み取りのためにファイルを開きます。ファイルが存在しない場合は作成します。ポインタは書き込みのために末尾から始まりますが、先頭から読み取るために移動できます(例:file.seek(0) を使用)。

'r+' を実演してみましょう。ステップ 1 で作成した my_reading_file.txt を使用します。ファイルを開き、コンテンツを読み取り、ポインタを先頭に戻し、ファイルの先頭を上書きします。

/home/labex/projectrplus_example.py という名前の Python ファイルを作成します。次のコードを追加します。

try:
    ## ファイルを読み書きモード ('r+') で開く
    ## このモードでは、ファイルが存在する必要があります。
    with open('/home/labex/project/my_reading_file.txt', 'r+') as file:
        ## 初期コンテンツを読み取る
        initial_content = file.read()
        print("Initial file content:")
        print(initial_content)

        ## ファイルポインタを先頭に戻す
        print("\nMoving pointer to the beginning using file.seek(0).")
        file.seek(0)

        ## 先頭に新しいコンテンツを書き込む(既存のコンテンツを上書きする)
        print("Writing new content...")
        file.write("Prepended line 1.\n")
        file.write("Prepended line 2.\n")

        ## 新しいコンテンツが上書きされたものよりも短い場合、
        ## 切り捨てられない限り、元のコンテンツの残りの部分が残る可能性があります。
        ## 書き込み後に file.truncate() を使用して、末尾の古いデータを削除できます。
        print("Truncating file to the current position to remove old trailing data.")
        file.truncate()

        print("\nContent written and file truncated.")

except FileNotFoundError:
    print("Error: The file was not found. 'r+' requires the file to exist.")
except Exception as e:
    print(f"An error occurred: {e}")

print("\nFinished with r+ mode example.")

このスクリプトは、'r+' でファイルを開き、読み取り、先頭に戻り (file.seek(0))、新しい行を書き込み(上書き)、次に file.truncate() を使用して、新しく書き込まれたテキストを超えて存在する可能性のある残りの元のコンテンツを削除します。

rplus_example.py を保存します。実行する前に、my_reading_file.txt に元のコンテンツがあることを確認しましょう。

echo "This is the first line." > /home/labex/project/my_reading_file.txt
echo "This is the second line." >> /home/labex/project/my_reading_file.txt

次に、ターミナルから Python スクリプトを実行します。

python rplus_example.py

初期コンテンツが出力され、その後にプロセスに関するメッセージが表示されます。

Initial file content:
This is the first line.
This is the second line.


Moving pointer to the beginning using file.seek(0).
Writing new content...
Truncating file to the current position to remove old trailing data.

Content written and file truncated.

Finished with r+ mode example.

cat を使用して最終的なファイルコンテンツを確認します。

cat /home/labex/project/my_reading_file.txt

出力には、上書きと切り捨てのおかげで、新しく書き込まれたコンテンツのみが表示されるはずです。

Prepended line 1.
Prepended line 2.

適切なファイルアクセスモードの選択

正しいモードを選択することが重要です。簡単なガイドを次に示します。

  • 既存のファイルへの読み取り専用アクセスには 'r' を使用します。
  • 'w' を使用して新しいファイルを作成するか、既存のファイルの内容を完全に置き換えます。
  • 既存のデータを失うことなくファイルの末尾に追加するには 'a' を使用します(ログに適しています)。
  • 'r+' を使用して、既存のファイルを先頭から読み取りおよび変更します。
  • 'w+' を使用して、ファイルを作成または上書きし、読み書きします。
  • 'a+' を使用してファイルに追記し、読み取りもできるようにします(シークが必要)。

次の表に、主要な動作をまとめます。

モード 読み取り 書き込み 存在しない場合に作成 存在する場合に切り捨て ポインタ位置 (初期)
'r' はい いいえ いいえ いいえ 先頭
'w' いいえ はい はい はい 先頭
'a' いいえ はい はい いいえ 末尾
'r+' はい はい いいえ いいえ 先頭
'w+' はい はい はい はい 先頭
'a+' はい はい はい いいえ 末尾

読み取り、書き込み、追記、既存のファイルの処理、または新しいファイルの作成が必要かどうかを検討することで、タスクに最適なモードを自信を持って選択できます。

まとめ

この実験(Lab)では、Python のさまざまなファイルアクセスモードと、それらの主な違いについて学びました。基本的な読み取り、書き込み、および追記操作のために、それぞれ 'r''w'、および 'a' モードを調査しました。また、より柔軟性を提供する読み書きモード ('r+''w+''a+') についても簡単に触れました。

これらのモードを実践し、ファイルの作成、切り捨て(truncate)、およびポインタ位置に関する動作を理解することで、Python でのファイル処理タスクに適切なモードを選択できるようになりました。この知識は、アプリケーションでファイルを効果的に管理および操作するための基本となります。