Python中的文件指针

3 投票
3 回答
19957 浏览
提问于 2025-04-17 23:31

我在Python的文件处理方面有一些问题,希望能帮我理清楚。

假设我创建了一个这样的文件。

>>>f = open("text,txt", "w+")
>>>f.tell()
>>>0

f是一个文件对象。

  1. 我可以把它当作文件指针吗?

  2. 如果可以,那f指向的是什么?是文件结构中为第一个字节预留的空位吗?

  3. 我可以认为文件结构是从零开始计数的吗?

  4. 在微处理器中,我学到指针总是指向下一条指令。在Python中是怎样的呢?如果我在文件中写一个字符,比如'b',那么我的文件指针是指向字符'b',还是指向'b'后面的那个位置呢?

3 个回答

1
  1. 文件对象其实没什么特别的。你可以把它当作一个普通的对象来理解。
  2. 这里的 name f 指向的是堆内存中的文件对象,就像在 l = [1, 2, 3] 中,名字 l 指向的是堆内存中的列表对象一样。
  3. 根据文档,文件对象没有 __getitem__ 这个成员,所以这个问题其实没有什么意义。
2
  1. 这个file对象是用C语言标准库里的stdio实现的。所以它里面有一个“文件描述符”。简单来说,它实际上包含了一个指向struct FILE的指针,这个指针通常被称为文件指针。你可以使用tellseek这两个功能来获取和设置文件的位置。另外,它还可以作为一个迭代器上下文管理器使用,所以它的功能比你想象的要多。

  2. 它不是一个指针,而是一个引用。记住,在Python中,f是一个名字,它引用了一个文件对象

  3. 如果你使用file.seek(),默认情况下它是用从0开始的绝对位置来定位的。

  4. 你把处理器寄存器和文件处理搞混了。这个问题没有意义。

6

你没有指定版本,文件对象在Python 2和Python 3之间的表现有点不同。大体思路是一样的,但一些具体细节不太一样。以下内容假设你使用的是Python 3,或者在Python 2.6或2.7中使用的是来自io模块的open,而不是Python 2自带的open


这并不是一个文件指针,虽然在后台很可能是用指针来实现的。与C语言不同,Python并不直接使用指针的概念。

不过,你可能在想的是“流位置”,这有点像指针。这个位置是通过tell()获取的,可以用在seek()中。对于二进制文件来说,它是从文件开始的字节偏移量。对于文本文件来说,它只是一个对文件对象有意义的“偏移量”——文档称之为“不可见的数字”(也就是说,它在文件存储在磁盘上的方式上没有明确的物理意义)。但在这两种情况下,它都是从开始位置的偏移,因此开始位置是零。只有在文件支持随机访问的情况下,这个说法才成立——你通常会遇到这种情况,但也要准备好最终可能会遇到不支持的情况——在这种情况下,seektell会报错。

就像处理器中的指令指针一样,流位置是下一个操作开始的位置,而不是当前操作结束的位置。所以,是的,当你把一个字符串写入文件后,当前的位置通常会比那个位置多一个偏移值。

当你刚打开一个文件时,偏移量通常是零或文件的末尾(比你能读取的最大值多一个,避免到达EOF)。如果你以'r'模式打开,它会是零;如果以'a'模式打开,它会是文件的末尾;而'w'和'w+'模式则是把文件截断到零字节,所以这两种模式也是等价的。

撰写回答