首页 > 解决方案 > 增加对 Python read() 函数的理解

问题描述

我有以下 Python 3 脚本:

from sys import argv

script, filename = argv

txt = open(filename)

print(f"Here's your file {filename}:")

print(txt.read())

当我们使用内置函数时,open()我们打开文件并返回相应的文件对象。

我知道这read()不是内置函数,而是文件对象的方法。

如 Python 文档中关于文件对象https://docs.python.org/3/glossary.html#term-file-object中所述:

实际上存在三类文件对象:原始二进制文件、缓冲二进制文件和文本文件。它们的接口在 io 模块中定义。

我真的很难理解几个关键领域。

1) 我如何知道我将使用原始二进制文件、缓冲二进制文件和文本文件中的哪种文件对象类型?在这个例子中,我使用了一个简单的 .txt 文件,所以我假设文件对象是一个文本文件。

2)我如何知道read()我在使用io模块时调用了哪个具体的方法?它属于哪个类,因为多个类都有可用的 read 方法

请保持答案尽可能简单,因为我对 Python 还很陌生。我只是不太了解 io 模块的文档。从第 3 步开始,我很快就迷失了方向,需要通过简单的步骤向我解释。

我正在努力理解浏览文档的逻辑步骤,因此请酌情修改这些步骤。

我的理解如下:

  1. 我们调用内置open()函数
  2. 这将打开一个文件并返回相应的文件对象。
  3. 然后我们使用该io模块来处理文件对象。
  4. 确定我们正在使用的文件对象的类别,在这种情况下我相信它是文本 I/O
  5. 文本 IO 状态“文本流 API 的文档中有详细描述 TextIOBase。”
  6. 使用的类io.TextIOBase具有各种方法,例如read()可用的。

标签: pythonpython-3.x

解决方案


任何文件对象之间都有某些相同的东西,您可以在类层次结构中看到。所有文件对象都有IOBase作为它们的基类,它定义了所有文件对象共有的东西。然后它专门研究RawIOBase,BufferedIOBaseTextIOBase类,然后进一步专门研究FileIOBytesIO等等。这是一个典型的 OOP 类层次结构。

它们的共同点是它们都定义了一个read方法。该方法所做的在细节上略有不同,但整体功能是相同的:它从基础数据中读取并返回该数据。那是典型的 OOP 抽象/封装/多态:您不需要关心它是如何做的或它到底做了什么,您只需要知道您调用.read()来获取数据。

您可以单独实例化这些类,但通常用于open简化可能复杂的任务。open根据您的确切要求决定返回给您的课程:

文本输入/输出

文本 I/O 期望并产生str对象。这意味着只要后备存储本身由字节组成(例如在文件的情况下),数据的编码和解码以及平台特定换行符的可选翻译都是透明的。

创建文本流的最简单方法是使用open(),可选择指定编码:

f = open("myfile.txt", "r", encoding="utf-8")

二进制 I/O

二进制 I/O(也称为缓冲 I/O)需要bytes类似对象并产生bytes对象。不执行编码、解码或换行转换。[...]

创建二进制流的最简单方法是 在字符串中使用open()with :'b'mode

f = open("myfile.jpg", "rb")

原始 I/O

原始 I/O(也称为无缓冲 I/O)通常用作二进制和文本流的低级构建块;从用户代码直接操作原始流很少有用。buffering 不过,您可以通过在禁用的二进制模式下打开文件来创建原始流:

f = open("myfile.jpg", "rb", buffering=0)

推荐阅读