Python中'a+'文件打开模式中的Bug?

3
我正在使用python-fuse制作一个文件系统,想知道每种模式('r','r+'等)的文件指针从哪里开始,我在多个网站上发现,除非以'a'或'a+'打开,否则文件指针从零开始,否则它将从文件末尾开始。
我在Python中进行了测试(在每种模式下打开文本文件并立即调用tell()),但是当以'a+'打开时,文件指针位于零而不是文件末尾。
这是Python中的错误吗,还是网站上的信息有误?
参考资料: - 其中之一的网站(搜索“file pointer”) - 我正在Ubuntu上使用Python 2.7.3

唯一有意义的情况是你打开的文件是全新的。否则就必须存在一个错误。 - Florin Stingaciu
我可以确认在Ubuntu上的CPython 2.6中看到了这种行为。PyPy似乎按预期打开到文件结尾。 - kwatford
Python 2.6.6 在 Centos 6 上也能够正常运行。 - Florin Stingaciu
3个回答

5
不,这不是一个BUG。
当你在写入一些数据之后调用tell()函数会发生什么呢?它会在文件的末尾进行写入,而不是在位置0处进行写入。我可以几乎肯定这是后者。
>>> f = open('test', 'a+')
>>> f.tell()
0
>>> f.write('this is a test\n')
>>> f.tell()
15
>>> f.close()
>>> f = open('test', 'a+')
>>> f.tell()
0
>>> f.write('this is a test\n')
>>> f.tell()
30

因此,在写入数据之前,它会寻找文件的末尾。

这就是应该的方式。来自fopen()手册页面:

   a+     Open for reading and appending (writing at end  of  file).   The
          file is created if it does not exist.  The initial file position
          for reading is at the beginning  of  the  file,  but  output  is
          always appended to the end of the file.

哎呀,幸好我是正确的。


感谢您澄清这个问题。我知道它只会将数据写入末尾,但找不到任何指定起始位置的地方。再次感谢您的帮助。 - bradleyjkemp

3
我认为这不是一个BUG(尽管我不太明白这是关于什么的)。文档中说:

...'a'表示追加(在某些Unix系统上意味着所有写操作都追加到文件的结尾,而不考虑当前的寻址位置)

事实上就是这样的:

In [3]: hello = open('/tmp/hello', 'w')

In [4]: hello.write('Hello ')

In [5]: hello.close()

In [6]: world = open('/tmp/hello', 'a+')

In [7]: world.write('world!')

In [8]: world.close()

In [9]: open('/tmp/hello').read()
Out[9]: 'Hello world!'

我使用Ubuntu系统,在a+模式下,tell()函数也会返回0


1
< p >传递给open()的模式只是传递给C fopen()函数。 a+应该将流的位置设置为0,因为文件既可以读取又可以附加打开。在大多数Unix系统(可能还有其他地方),所有写入都将在文件末尾完成,而不管您在文件中的何处进行了seek()


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