如何从以"a+"模式打开的文件中读取?
根据定义,“a+”模式是用来同时打开文件进行追加和读取的。追加是可以正常工作的,但读取的方法是什么呢?我查了一些资料,但没有找到明确的解释。
f=open("myfile.txt","a+")
print (f.read())
我试了这个,结果打印出来是空的。
4 个回答
在新版本的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)
来确保安全。
当你用 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
会自动把指针移动到最后一行,然后再进行写入。
使用 f.seek()
可以把文件的位置设置到文件的开头。
注意:在 Python 2.7 之前,有个 bug 会导致某些操作系统的文件位置不总是指向文件的末尾。这可能会让一些用户觉得你的原始代码能正常工作。例如,在 CentOS 6 上,你的代码可能会按你想要的那样工作,但实际上并不符合预期。
f = open("myfile.txt","a+")
f.seek(0)
print f.read()