2

我正在处理一个二进制文件(.gz 文件),试图以附加模式(ab+)打开它。

正如文件 open() 以附加模式打开它所保证的那样,导致 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”中观察到相同的行为。有没有人遇到过这种情况?

4

1 回答 1

3

正如文档所说:

'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,那么open在所有 POSIX 系统上最终只依赖于fopen. 所以,让我们看一下手册页。

Linux fopen(3)

一个+

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

苹果电脑fopen(3)

``a+'' 为读写打开。如果文件不存在,则创建该文件。流位于文件的末尾。对文件的后续写入将始终在文件的当前末尾结束,而与任何干预 fseek(3) 或类似内容无关。


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

于 2013-09-25T20:58:14.393 回答