検索
連載

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

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

PC用表示 関連情報
Share
Tweet
LINE
Hatena
「解決!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'が画面に表示されている。

 このように'+'を付加することで、ファイルに書き込みをしたり、ファイルから読み込みをしたりすることが可能になる。

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


 この例では、open関数のモードに'r+'を指定してファイルをオープンしている。このときには、ファイルの内容は削除されず、ファイルポインタはファイル先頭を指している。そのため、ここで行っているように、'atmark IT'をwriteメソッドで書き込もうとすると、ファイルの内容が先頭から上書きされる。

 その後、seekメソッドでファイルポインタを先頭に移動して、readメソッドで読み込みを行うと、'atmark ITder'と以前の内容に上書きをした結果が得られる。

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


 この例では、open関数のモードに'a+'を指定している。このときには、ファイルの内容は削除されず、ファイルポインタはファイル末尾を指している。そのため、writeメソッドで書き込んだ内容は、ファイルの末尾に追記される。

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


 この例では、open関数のモードに'x+'を指定して、既存のファイル(test.txt)をオープンしようとしている。'x+'はファイルを「排他的にオープン」する(ファイルをオープンする場所に、その名前のファイルがない状態で新規に作成する)ので、この場合はFileExistsError例外が発生する。

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関数のモードに'x+'を指定して、今度は存在しないファイルの名前を指定している。それまでファイルは存在していなかったので、ファイルのオープンに成功し、ファイルの内容が削除されるかどうかは関係なく、ファイルポインタはファイル先頭(=ファイル末尾)を指す。

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

解決!Python

Copyright© Digital Advantage Corp. All Rights Reserved.

[an error occurred while processing this directive]
ページトップに戻る