前提・実現したいこと
Pythonの勉強中です。mode='r+'でopenした場合の、read/write位置について疑問に思い、試していたところ、おかしな現象に遭遇しました。
mode='r+'でopen直後にwriteした後、何もしないかreadするとデータが先頭から上書きされるのに、readlineすると末尾に追加で書き込まます。後の命令により書込位置が変わるのは、Pythonのような言語では良くない現象と思います。
これは、Pythonの言語仕様なのでしょうか? それともバグ?
発生している問題・エラーメッセージ
以下に実行結果を示します。
original *********************************** '0123456789\nabcdefghij\n' write : '987654321' write *********************************** '9876543219\nabcdefghij\n' write,read *********************************** read: '9\nabcdefghij\n' '9876543219\nabcdefghij\n' write,readline *********************************** readline: '0123456789\n' '0123456789\nabcdefghij\n987654321'
該当のソースコード
Python
1s_org = '0123456789\nabcdefghij\n' 2s_write = '987654321' 3 4print('original ***********************************') 5with open('test.txt', mode = 'w') as f: 6 f.write(s_org) 7with open('test.txt') as f: 8 s_read = f.read() 9print(repr(s_read)) 10print('write :',repr(s_write)) 11 12print('\nwrite ***********************************') 13with open('test.txt', mode = 'r+') as f: 14 f.write(s_write) 15with open('test.txt') as f: 16 s_read = f.read() 17 print(repr(s_read)) 18 19print('\nwrite,read ***********************************') 20with open('test.txt', mode = 'w') as f: 21 f.write(s_org) 22with open('test.txt', mode = 'r+') as f: 23 f.write(s_write) 24 s_read1 = f.read() 25print('read:', repr(s_read1)) 26with open('test.txt') as f: 27 s_read = f.read() 28 print(repr(s_read)) 29 30print('\nwrite,readline ***********************************') 31with open('test.txt', mode = 'w') as f: 32 f.write(s_org) 33with open('test.txt', mode = 'r+') as f: 34 f.write(s_write) 35 s_line1 = f.readline() 36print('readline:', repr(s_line1)) 37with open('test.txt') as f: 38 s_read = f.read() 39 print(repr(s_read))
試したこと
ネットで検索してみましたが、同様な事象に関する情報は見つけられませんでした。
補足情報(FW/ツールのバージョンなど)
試した環境は、以下の通り。
Windows10 Home x64 21H1 ビルド 19043.1165 Python 3.9.5 x64
Windows 11 Pro ビルド 22000.168 Python 3.9.6 x64。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/01 07:32
2021/09/01 10:45
2021/09/01 11:58
2021/09/01 12:17
2021/09/01 12:45