使用 'a+' 时由于 file.readline() 导致意外输出

问题描述 投票:0回答:3

最初,我有一个名为

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'

为什么会出现这种情况?

python file-handling
3个回答
0
投票

请注意修改后的代码中的注释:

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']

0
投票

你误用了

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):离开当前流位置 不变。

任何其他参数组合都是无效的,并且可能会引发 例外。


0
投票

你应该使用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()
© www.soinside.com 2019 - 2024. All rights reserved.