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

17 投票
4 回答
15380 浏览
提问于 2025-04-17 14:24

根据定义,“a+”模式是用来同时打开文件进行追加和读取的。追加是可以正常工作的,但读取的方法是什么呢?我查了一些资料,但没有找到明确的解释。

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

我试了这个,结果打印出来是空的。

4 个回答

1

在新版本的Python中,依赖于操作系统的某些小问题仍然存在,这些问题是因为不同操作系统在实现fopen()这个函数时的差异。

在Linux系统中,man fopen的说明是:

a+ - 这个模式是用来读取和追加内容(在文件末尾写入)。如果文件不存在,就会创建一个新的文件。读取时,文件指针会从文件开头开始,但写入的内容总是追加到文件的末尾。

在OS X系统中:

``a+'' - 这个模式也是用来读取和写入。如果文件不存在,同样会创建一个新的文件。文件指针一开始就位于文件的末尾。之后对文件的写入操作总是会在当前的文件末尾进行,不管中间有没有用fseek(3)或类似的操作。

在MSDN上并没有明确说明指针最开始的位置,只是说写入时指针会移动到文件末尾。

当用"a"或"a+"模式打开文件时,所有的写入操作都会发生在文件的末尾。虽然可以用fseek或rewind来重新定位文件指针,但在进行任何写入操作之前,指针总是会被移动回文件的末尾。因此,已经存在的数据是无法被覆盖的。

在不同系统上用Python 2.7.x和3k复现这些差异其实很简单,可以使用.open.tell

在处理任何与操作系统相关的事情时,最好采取一些预防措施,比如使用.seek(0)来确保安全。

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 会自动把指针移动到最后一行,然后再进行写入。

24

使用 f.seek() 可以把文件的位置设置到文件的开头。

注意:在 Python 2.7 之前,有个 bug 会导致某些操作系统的文件位置不总是指向文件的末尾。这可能会让一些用户觉得你的原始代码能正常工作。例如,在 CentOS 6 上,你的代码可能会按你想要的那样工作,但实际上并不符合预期。

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

撰写回答