如何从以"a+"模式打开的文件中读取数据?

16

"a+" 模式定义为同时打开文件进行附加和读取操作。附加操作是有效的,但读取操作应该如何执行?我做了一些搜索,但无法在任何地方找到相关解释。

f=open("myfile.txt","a+")
print (f.read())

尝试过这个,但是它打印了空白。
4个回答

24

使用f.seek()将文件偏移量设置为文件开头。

注意:在Python 2.7之前存在一个错误,会导致一些操作系统的文件位置指针不始终指向文件末尾。这可能会导致某些用户无法按您原来的代码工作。例如,在CentOS 6上,您的代码将按您想要的方式工作,但并不是应该的方式。

f = open("myfile.txt","a+")
f.seek(0)
print f.read()

谢谢,它有效。也许如果我在我的问题中添加“Windows”标签会更好,因为它似乎与操作系统有关。 - morris
不,正确的行为应该是你看不到任何输出。在一些运行着 Python 2.7 版本之前的操作系统上,由于文件位置设置不当,可能会看到输出。 - Bill Lynch
抱歉,你是告诉我在 Windows7 上使用 Python3 执行该代码时,我不应该看到文件内容? - morris
当您运行在问题中发布的代码时,不应该看到文件的内容,而应该在运行此答案中的代码时看到输出。 - Bill Lynch
这就是我所说的,你的代码可行。:) 再次感谢你。 - morris

3

当您使用f=open(myfile.txt,"a+")打开文件时,该文件可以同时进行读写操作。

默认情况下,文件句柄指向文件的开头,

这可以通过f.tell()来确定,其将为0L

In [76]: f=open("myfile.txt","a+")

In [77]: f.tell()
Out[77]: 0L

In [78]: f.read()
Out[78]: '1,2\n3,4\n'

然而,f.write会在写入之前移动指针到最后一行。

这真的很奇怪。在OS X上,它会指向文件的结尾,在Linux上它会指向文件的开头。 - Bill Lynch
是的。就这么简单。那个错误在2.7 Alpha 1中已经修复了。我的Linux系统还在运行2.6.2版本。 - Bill Lynch
我也用这个代码得到了空的输出。 - morris

1

新版本的Python仍然存在与操作系统相关的问题,这是由于stdio中fopen()函数实现的差异导致的。

Linux的man fopen

a+ - 以读取和追加模式打开文件(写入到文件末尾)。如果文件不存在,则创建该文件。用于读取的初始文件位置位于文件开头,但输出始终附加到文件末尾。

OS X:

"a+" - 以读取和写入模式打开文件。如果文件不存在,则创建该文件。流定位在文件末尾。随后对文件的写入始终会停留在当前文件末尾,而不管任何介于它们之间的fseek(3)或类似操作。

MSDN并没有明确指出指针最初设置在哪里,只是在写入时将其移动到末尾。

当使用“a”或“a+”访问类型打开文件时,所有写操作都发生在文件末尾。可以使用fseek或rewind重新定位文件指针,但在执行任何写操作之前,它总是被移动回文件末尾。因此,无法覆盖现有数据。

复制Python 2.7.x和3k上各系统的差异非常简单,只需使用.open .tell。在处理任何操作系统时,最好采取预防措施,例如使用显式的.seek(0)

0

模式 r+ 读写模式,从文件开头开始 r 只读模式,从文件开头开始 a+ 读/追加模式,通过在文件末尾写入来保留文件内容

祝好运! Isabel Ruiz


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接