tell()的Python在Mac OS X 10.8和Ubuntu 10.04上表现不同

时间:2013-09-25 20:49:15

标签: python macos ubuntu file-io

我正在尝试以附加模式(ab +)打开它的二进制文件(.gz文件)。

由open()文件保证在append模式下打开它会导致tell()指向文件末尾(EOF)。但这不是我在Ubuntu 10.04上看到的,因为在追加模式下打开文件,文件指针仍然指向文件的开头而不是结尾。但是在My Mac OS X 10.8上并非如此,因为函数的行为与预期的一样正确

在Ubuntu 10.04上看到的行为

Python 2.6.5 (r265:79063, Oct  1 2012, 22:04:36) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> fp = open("file_name.gz", "ab+")
>>> fp.tell()
0

通过

进行搜索可以得到正确的数字
>>> fp.seek(0, 2)
>>> fp.tell()
753236

在Mac OS X 10.8上看到的行为

Python 2.6.7 (r267:88850, Oct 11 2012, 20:15:00) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> fp = open("file_name.gz", "ab+")
>>> fp.tell()
753236

其他模式'a'和'a + b'观察到相同的行为。 有没有人遇到过这样的情况?

1 个答案:

答案 0 :(得分:3)

正如the documentation所说:

  

'a'用于追加(在某些 Unix系统上意味着所有写入都附加到文件的末尾而不管当前的搜索位置)

没有关于文件指针的起始位置,甚至括号内的部分仅在“某些Unix系统”上才为真。但是你期望它在所有平台上以相同的方式工作。不要那样做。

正确的答案是,如果你想要在最后,明确寻求最终:

fp = open("file_name.gz", "ab+")
fp.seek(0, 2)
fsize = fp.tell()

(当然,如果你只是想知道文件大小,你甚至不需要这个;你可以只fstat文件,或stat它甚至不打开它......)


实际上,无论搜索位置如何,OS X和Linux都会将所有写入附加到文件末尾。而且我相信他们都会在“a”模式中寻求最终,但在“a +”模式下会做不同的事情。如果您使用的是Python 2.x,则所有POSIX系统上的open最终都取决于fopen。那么,让我们看一下联机帮助页。

Linux fopen(3)

  

A +

     

打开阅读和追加(在文件末尾写)。如果文件不存在,则创建该文件。读取的初始文件位置位于文件的开头,但输出始终附加到文件的末尾。

Mac fopen(3)

  

``a +''开放阅读和写作。如果文件不存在,则创建该文件。流位于文件的末尾。对文件的后续写入将始终以当前文件末尾结束,无论是否有任何介入的fseek(3)或类似内容。


但细节并不重要;如果您正在编写可移植代码,则不能以这种方式使用a