読み書きモードの実践と適切なモードの選択
Python には、同じ open()
コンテキスト内で読み取りと書き込みの両方を可能にするモードも用意されています。これらはより柔軟性を提供しますが、ファイルポインタの慎重な取り扱いが必要です。
- 読み書き (
'r+'
): 既存のファイルを読み取りと書き込みの両方で開きます。ポインタは先頭から始まります。書き込みは、ポインタの位置から既存のコンテンツを上書きします。
- 書き込みと読み取り (
'w+'
): 書き込みと読み取りのためにファイルを開きます。ファイルが存在する場合は切り捨て、存在しない場合は作成します。ポインタは先頭から始まります。
- 追記と読み取り (
'a+'
): 追記(末尾への書き込み)と読み取りのためにファイルを開きます。ファイルが存在しない場合は作成します。ポインタは書き込みのために末尾から始まりますが、先頭から読み取るために移動できます(例:file.seek(0)
を使用)。
'r+'
を実演してみましょう。ステップ 1 で作成した my_reading_file.txt
を使用します。ファイルを開き、コンテンツを読み取り、ポインタを先頭に戻し、ファイルの先頭を上書きします。
/home/labex/project
に rplus_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+' |
はい |
はい |
はい |
いいえ |
末尾 |
読み取り、書き込み、追記、既存のファイルの処理、または新しいファイルの作成が必要かどうかを検討することで、タスクに最適なモードを自信を持って選択できます。