連載
» 2021年04月20日 05時00分 公開

[解決!Python]テキストファイルを読み書き両用にオープンするには解決!Python

open関数のモードに'+'を付加すると、ファイルを読み書き両用にオープンできる。'+'を付加したときのopen関数の振る舞いやコード例を紹介する。

[かわさきしんじ,Deep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

モード 概要 ファイルの内容 ファイルポインタ
r+ ファイルを読み書き両用でオープンする。
指定した名前のファイルがなければFileNotFoundError例外が発生する
以前のファイルの内容を削除しない ファイル先頭
w+ ファイルを読み書き両用でオープンまたは新規作成する 以前のファイルの内容を削除する ファイル先頭
a+ ファイルを読み書き両用でオープンまたは新規作成する 以前のファイルの内容を削除しない ファイル末尾
x+ ファイルを読み書き両用で排他的に新規に作成する。
指定した名前のファイルが既に存在していればFileExistsError例外が発生する
新規に作成 ファイル先頭
open関数のモードに'+'を付加した場合の振る舞い

with open('test.txt', 'w+') as f:  # ファイルを読み書き両用でオープン
    f.write('deep insider\n'# ファイル先頭から書き込み
    f.seek(0# ファイル先頭にファイルポインタを移動
    print(f.read(), end=''# deep insider:ファイル先頭から読み込んで表示

with open('test.txt', 'r+') as f:  # 内容を削除せずに読み書き両用でオープン
    f.write('atmark IT'# ファイル先頭から書き込み(上書き)
    f.seek(0# ファイル先頭にファイルポインタを移動
    print(f.read(), end=''# atmark ITder:ファイル先頭から読み込んで表示

with open('test.txt', 'a+') as f:
    f.write('python\n'# ファイル末尾に書き込み
    f.seek(0# ファイル先頭にファイルポインタを移動
    print(f.read(), end=''# ファイル先頭から読み込んで表示
# 出力結果:
#atmark ITder
#python

with open('test.txt', 'x+') as f:  # FileExistsError例外
    pass

with open('test2.txt', 'x+') as f:  # OK
    f.write('atmark IT\ndeep insider\n'# ファイル先頭から書き込み
    f.seek(0# ファイル先頭にファイルポインタを移動
    print(f.read(), end=''# ファイル先頭から読み込んで表示
# 出力結果:
#atmark IT
#deep insider


テキストファイルに読み書き両用にオープンするには

 open関数でファイルをオープンするときには'r'(読み込み)、'w'(書き込み)、'a'(追記)、'x'(排他的に書き込み)のいずれかを指定するが、これに'+'を付加すると、「更新目的」として読み書き両用でファイルがオープンされる。例えば、'r'なら読み込み用にファイルがオープンされるが、'r+'なら読み込みに加えて、書き込みも行えるということだ。

 なお、テキストファイルの読み込みについては「[解決!Python]テキストファイルを読み込むには」を、テキストファイルへの書き込みについては「[解決!Python]テキストファイルに書き込むには」を参照されたい。

 '+'を付加した場合のopen関数の振る舞いがどのようになるかを以下の表に示す。

モード 概要 ファイルの内容 ファイルポインタ
r+ ファイルを読み書き両用でオープンする。
指定した名前のファイルがなければFileNotFoundError例外が発生する
以前のファイルの内容を削除しない ファイル先頭
w+ ファイルを読み書き両用でオープンまたは新規作成する 以前のファイルの内容を削除する ファイル先頭
a+ ファイルを読み書き両用でオープンまたは新規作成する 以前のファイルの内容を削除しない ファイル末尾
x+ ファイルを読み書き両用で新規に作成する。
指定した名前のファイルが既に存在していればFileExistsError例外が発生する
新規に作成 ファイル先頭
open関数のモードに'+'を付加した場合の振る舞い

 以下に例を示す。

with open('test.txt', 'w+') as f:  # ファイルを読み書き両用でオープン
    f.write('deep insider\n'# ファイル先頭から書き込み
    f.seek(0# ファイル先頭にファイルポインタを移動
    print(f.read(), end=''# deep insider:ファイル先頭から読み込んで表示


 この例では、open関数のモードに'w+'を指定してファイルをオープンしている。そのため、既存ファイルであればその内容は削除され、ファイルポインタはファイル先頭を指すようになる。

 その後、writeメソッドで書き込みを行い、seekメソッドでファイルポインタを先頭に移動しているので、最後の行のreadメソッドではファイル先頭からファイルの内容が全て読み込まれる。その結果、ファイルに書き込んだ'deep insider\n'が画面に表示されている。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。