我目前正在使用python-fuse创建一个文件系统,并且正在查找文件指针在每个不同模式('r','r +'等)的起始位置,并在文件指针启动的多个站点上找到除非在文件末尾开始时在'a'或'a +'中打开,否则为零。
我在Python中对此进行了测试以确保(在每个模式中打开一个文本文件并立即调用tell())但发现当它在'a +'中打开时,文件指针为零而不是结束文件。
这是python中的错误,还是网站错了?
供参考:
答案 0 :(得分: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()
手册页:
p,幸运的是我是对的。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.
答案 1 :(得分: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()
也在0
模式下返回a+
。
答案 2 :(得分:1)
传递给open()
的模式只是传递给C fopen()
函数。 a+
应该将流的位置设置为0,因为文件是为读取和追加而打开的。在大多数unix系统(以及可能在其他地方),所有写入都将在文件末尾完成,无论文件在seek()
编辑的位置。