最初,我有一个名为
new_file
的文本文件,其中存储 1\n2\n3\n4\n5\n
我执行以下Python程序:
f = open('new_file', 'a+')
f.write('\n'.join(str(i) for i in range(1, 6)))
f.seek(0)
print(f.readlines())
f.seek(0)
f.write("\nFinal Line")
print(f.readlines())
f.close()
我希望程序首先将
1\n2\n3\n4\n5
添加到new_file
,然后打印['1\n', '2\n', '3\n', '4\n', '5\n', '1\n', '2\n', '3\n', '4\n', '5']
,最后将\nFinal Line
添加到new_file
并打印['1\n', '2\n', '3\n', '4\n', '5\n', '1\n', '2\n', '3\n', '4\n', '5\n', 'Final line']
文件的更改如我所料,但程序打印的是这样的:
['1\n', '2\n', '3\n', '4\n', '5\n', '1\n', '2\n', '3\n', '4\n', '5']
['1\n', '2\n', '3\n', '4\n', '5\n', '1\n', '2\n', '3\n', '4\n', '5'
为什么会出现这种情况?
请注意修改后的代码中的注释:
import os
try:
os.remove("new_file")
except FileNotFoundError:
pass
with open('new_file', 'a+') as f:
f.write('\n'.join(str(i) for i in range(1, 6)))
f.seek(0)
print(f.readlines())
# file pointer is now at EOF
f.write("\nFinal Line")
# seek to BOF
f.seek(0)
print(f.readlines())
输出:
['1\n', '2\n', '3\n', '4\n', '5']
['1\n', '2\n', '3\n', '4\n', '5\n', 'Final Line']
你误用了
TextIOWrapper.seek
:
seek(cookie,whence=os.SEEK_SET,/)
设置流位置。返回 新的流位置为
.int
支持四种操作,由以下参数给出 组合:
- seek(0, SEEK_SET):倒回到流的开头。
- seek(cookie, SEEK_SET):恢复之前的位置; cookie 必须是数字 由
返回。tell()
- seek(0, SEEK_END):快进到末尾 流。
- seek(0, SEEK_CUR):离开当前流位置 不变。
任何其他参数组合都是无效的,并且可能会引发 例外。
你应该使用w+模式而不是a+,你的索引在循环中是错误的,并且你的第二个seek语句位于第二个write语句的错误一侧。
为了达到您想要的结果,您的代码应该是:
f = open('new_file', 'w+')
f.write('\n'.join(str(i) for i in range(0, 6)))
f.seek(0)
print(f.readlines())
f.write("\nFinal Line")
f.seek(0)
print(f.readlines())
f.close()