3

我目前正在使用 python-fuse 制作文件系统,并正在查找每种不同模式('r'、'r+'等)的文件指针从哪里开始,并在多个站点上发现文件指针从零开始,除非它在文件末尾开始时以“a”或“a+”打开。

我在 Python 中对此进行了测试以确保(在每种模式下打开一个文本文件并立即调用 tell()),但发现当它在“a+”中打开时,文件指针为零而不是文件末尾。

这是python中的错误,还是网站错误?

以供参考:

  • 网站之一(搜索“文件指针”)
  • 我在 Ubuntu 上使用 Python 2.7.3
4

3 回答 3

5

不,这不是错误。

写入一些数据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.

呸,幸运的是我是对的。

于 2012-06-13T14:58:55.957 回答
3

我不认为这是一个错误(尽管我并不完全理解这是什么)。文档说:

...'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 上,tell()0a+模式返回。

于 2012-06-13T14:27:13.377 回答
1

传递给的模式open()只是传递给 Cfopen()函数。a+应该将流的位置设置为 0,因为文件是为读取和追加而打开的。在大多数 unix 系统(可能还有其他地方)上,所有写入都将在文件末尾完成,无论您seek()编辑到文件的哪个位置。

于 2012-06-13T14:57:26.593 回答