【问题标题】:File pointer in pythonpython中的文件指针
【发布时间】:2014-03-23 10:54:35
【问题描述】:

我有一堆关于 Python 文件处理的问题。请帮我整理一下。

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

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

f 是一个文件对象。

  1. 我可以假设它是一个文件指针吗?

  2. 如果是,f 指向什么?为文件结构中的第一个字节保留的空白空间?

  3. 我可以假设文件结构为零索引吗?

  4. 在微处理器中,我学到的是指针总是指向下一条指令。在 python 中是怎样的?如果我在文件中写一个字符说'b',我的文件指针会指向字符'b'还是指向'b'旁边的位置?

【问题讨论】:

    标签: python file file-io


    【解决方案1】:

    您不指定版本,文件对象在 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+' 模式是等效的,因为它们会将文件截断为零字节。

    【讨论】:

      【解决方案2】:
      1. file 对象是使用 C 标准库的 stdio 实现的。所以它包含一个“文件描述符”(因为它基于stdio,“在底​​层”它将包含一个指向struct FILE 的指针,这就是通常所说的文件指针。)。您可以使用tellseek。另一方面,它也是iteratorcontext manager。所以它具有更多的功能。
      2. 它不是一个指针,而是一个引用。请记住,在 Python 中f 是一个名称引用一个文件对象
      3. 如果您使用file.seek(),则默认使用基于0的绝对定位。
      4. 您将processor register 与文件处理混淆了。这个问题毫无意义。

      【讨论】:

        【解决方案3】:
        1. 文件对象没有什么特别之处。把它想象成一个对象
        2. namef 指向堆上的文件对象,就像在l = [1, 2, 3] 中,名称l 指向堆上的列表对象
        3. 来自the documentation,没有__getitem__成员,所以这不是一个有意义的问题

        【讨论】:

          猜你喜欢
          • 2021-11-06
          • 1970-01-01
          • 1970-01-01
          • 2011-03-07
          • 1970-01-01
          • 2010-12-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多