我在Python的文件处理中有一堆问题。请帮我整理一下。
假设我创建一个像这样的文件:
>>>f = open("text,txt", "w+")
>>>f.tell()
>>>0
f是一个文件对象
我可以假设它是一个文件指针吗?
如果是,f指的是什么?为文件结构中的第一个字节保留的空空间?
我可以假设文件结构是零索引吗?
在微处理器中,我学到的是指针总是指向下一条指令。在python中是怎样的?如果我在文件中写一个字符说'b',我的文件指针会指向字符'b'或'b'旁边的位置吗?
您不指定版本,并且Python 2和Python 3之间文件对象的行为略有不同。总的思路是一样的,但是一些具体的细节是不同的。以下假设您正在使用Python 3,或者您正在使用Python 2.6或2.7中io
模块的open版本,而不是Python 2的内置open
。
它不是一个文件指针,尽管它很有可能在幕后被实现。与C语言不同,Python不公开指针的概念。
然而,你似乎在想的是"流位置",这有点类似于指针。这是tell()
报告的数字,可以馈入seek()
。对于二进制文件,它是从文件开始的字节偏移量。在文本文件中,它只是对文件对象有意义的"偏移量"——文档称其为"不透明数字"(即,就文件如何存储在磁盘上而言,它没有定义的物理含义)。但在这两种情况下,它都是起点的偏移量,因此起点为零。这只有在文件支持随机访问时才成立——通常支持随机访问,但要准备好最终遇到不支持随机访问的情况——在这种情况下,seek
和tell
会引发错误。
与处理器中的指令指针一样,流位置是下一个操作开始的位置,而不是当前操作结束的位置。所以,是的,在你向文件中写入一个字符串之后,当前位置通常会超过它的一个偏移值。
当您刚刚打开一个文件时,偏移量通常为零或文件末尾(比您可以在不获得EOF的情况下读取的最大值高一个)。如果你以'r'模式打开它,它将为零,如果你以'a'模式打开它,它将为结束,这两个模式对于'w'和'w+'模式是等效的,因为它们将文件截断为零字节。
- 它不是指针,而是引用。请记住,在Python中
f
是一个名称,该引用一个文件对象。 - 如果你使用的是
file.seek()
,它默认使用基于0的绝对定位。你把处理器寄存器和文件处理混淆了。这个问题没有意义。
file
对象是使用C标准库的stdio
实现的。所以它包含一个"文件描述符"(因为它基于stdio
,"在底层"它将包含一个指向struct FILE
的指针,这就是通常所说的文件指针)。你可以使用tell
和seek
。另一方面,它也是一个迭代器和上下文管理器。所以它有更多的功能- 文件对象没有什么特别的。把它想象成一个对象
-
名称
f
指向堆上的文件对象,就像在l = [1, 2, 3]
中名称l
指向堆上的列表对象 从文档中,没有
__getitem__
成员,所以这不是一个有意义的问题