Python中的文件指针
我在Python的文件处理方面有一些问题,希望能帮我理清楚。
假设我创建了一个这样的文件。
>>>f = open("text,txt", "w+")
>>>f.tell()
>>>0
f是一个文件对象。
我可以把它当作文件指针吗?
如果可以,那f指向的是什么?是文件结构中为第一个字节预留的空位吗?
我可以认为文件结构是从零开始计数的吗?
在微处理器中,我学到指针总是指向下一条指令。在Python中是怎样的呢?如果我在文件中写一个字符,比如'b',那么我的文件指针是指向字符'b',还是指向'b'后面的那个位置呢?
3 个回答
- 文件对象其实没什么特别的。你可以把它当作一个普通的对象来理解。
- 这里的 name
f
指向的是堆内存中的文件对象,就像在l = [1, 2, 3]
中,名字l
指向的是堆内存中的列表对象一样。 - 根据文档,文件对象没有
__getitem__
这个成员,所以这个问题其实没有什么意义。
这个
file
对象是用C语言标准库里的stdio
实现的。所以它里面有一个“文件描述符”。简单来说,它实际上包含了一个指向struct FILE
的指针,这个指针通常被称为文件指针。你可以使用tell
和seek
这两个功能来获取和设置文件的位置。另外,它还可以作为一个迭代器和上下文管理器使用,所以它的功能比你想象的要多。它不是一个指针,而是一个引用。记住,在Python中,
f
是一个名字,它引用了一个文件对象。如果你使用
file.seek()
,默认情况下它是用从0开始的绝对位置来定位的。你把处理器寄存器和文件处理搞混了。这个问题没有意义。
你没有指定版本,文件对象在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+'模式则是把文件截断到零字节,所以这两种模式也是等价的。