python - 增加对 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 步开始,我很快就迷失了方向,需要通过简单的步骤向我解释。
我正在努力理解浏览文档的逻辑步骤,因此请酌情修改这些步骤。
我的理解如下:
- 我们调用内置
open()
函数 - 这将打开一个文件并返回相应的文件对象。
- 然后我们使用该
io
模块来处理文件对象。 - 确定我们正在使用的文件对象的类别,在这种情况下我相信它是文本 I/O
- 文本 IO 状态“文本流 API 的文档中有详细描述
TextIOBase
。” - 使用的类
io.TextIOBase
具有各种方法,例如read()
可用的。
解决方案
任何文件对象之间都有某些相同的东西,您可以在类层次结构中看到。所有文件对象都有IOBase
作为它们的基类,它定义了所有文件对象共有的东西。然后它专门研究RawIOBase
,BufferedIOBase
和TextIOBase
类,然后进一步专门研究FileIO
和BytesIO
等等。这是一个典型的 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)
推荐阅读
- asp.net-mvc - 检查 Html Input 文本字段是否有值
- excel - 忽略后缀查找姓氏
- sql - SQL更新多列计数
- spring-boot - 使用 ParallelScatterZipCreator 从 rest 模板异步读取 InputStream 以压缩文件
- node.js - 被 npm config set 搞糊涂了
- java - 使用java将数据从数据库加载到另一个数据库
- haskell - ghci 超级慢吗?
- c++ - ucrtbased.dll:访问冲突
- autodesk-forge - 查看器 loadModel - 使用 JWT 身份验证的路由
- javascript - React 警告 - useEffect 缺少依赖项