io – 输入/输出流

该模块实现了相应 CPython 模块的 一个子集,如下所述。有关更多信息,请参阅原始 CPython 文档: io.

该模块包含其他类型的 stream (类文件)对象和辅助函数。

概念层次

与 CPython 的区别

如本节所述,MicroPython 中简化了流基类的概念层次结构。

(抽象)基本流类作为所有具体类的行为的基础,在 CPython 中遵循很少的二分法(成对分类)。在 MicroPython 中,它们在某种程度上进行了简化和隐式,以实现更高的效率和节省资源。

CPython 中一个重要的二分法是无缓冲和缓冲流。在 MicroPython 中,所有流当前都是无缓冲的。这是因为所有现代操作系统,甚至许多 RTOS 和文件系统驱动程序都已经在他们这边执行了缓冲。添加另一层缓冲会适得其反(称为“缓冲膨胀”的问题)并占用宝贵的内存。请注意,仍然存在缓冲可能有用的情况,因此我们可能会在稍后引入可选的缓冲支持。

但在 CPython 中,另一个重要的二分法与“缓冲性”有关——流是否会导致短读/写。短读是指用户从流中请求例如 10 个字节,但得到的更少,类似于写。在 CPython 中,无缓冲的流自动容易受到短操作的影响,而缓冲的则可以保证不受它们的影响。不短的读/写是一个重要的特性,因为它允许开发更简洁和高效的程序——这是 MicroPython 非常需要的。因此,虽然 MicroPython 不支持缓冲流,但它仍然提供无短操作流。是否会有短操作取决于每个特定类的需求,但出于上述原因,强烈建议开发人员支持无短操作行为。例如,MicroPython 套接字保证避免短读/写。实际上,此时,核心中没有短操作流类的示例,一个是特定于端口的类,其中这种需求由硬件特性控制。

在非阻塞流的情况下,无短操作行为变得棘手,阻塞与非阻塞行为是另一个 CPython 二分法,完全受 MicroPython 支持。非阻塞流从不等待数据到达或写入——它们尽可能地读/写,或发出缺少数据的信号(或写入数据的能力)。显然,这与“no-short-operations”策略相冲突,事实上,在 CPython 中,非阻塞缓冲(和这个 no-short-ops)流的情况令人费解——在某些地方,这种组合是被禁止的,在某些地方它是未定义的或只是没有记录,在某些情况下它会引发详细的异常。MicroPython 中的问题要简单得多:非阻塞流对于高效的异步操作很重要,因此此属性在“无短操作”中占优势。所以,

最后的二分法是二进制与文本流。MicroPython 当然支持这些,但是虽然在 CPython 中文本流本身是缓冲的,但它们不在 MicroPython 中。(确实,这是我们可能引入缓冲支持的情况之一。)

请注意,为了效率,MicroPython 不提供对应于上述层次结构的抽象基类,并且无法在纯 Python 中实现或子类化流类。

职能

io.open(name, mode='r', **kwargs)

打开一个文件。内置 open()函数是这个函数的别名。所有端口(提供对文件系统的访问)都需要支持 mode 参数,但对其他参数的支持因端口而异。

班级

class io.FileIO(...)

这是以二进制模式打开的文件类型,例如使用. 您不应直接实例化此类。open(name, "rb")

class io.TextIOWrapper(...)

这是在文本模式下打开的文件类型,例如使用. 您不应直接实例化此类。 open(name, "rt")

class io.StringIO([string])
class io.BytesIO([string])

用于输入/输出的内存文件类对象。StringIO 用于文本模式 I/O(类似于使用“t”修饰符打开的普通文件)。 BytesIO用于二进制模式 I/O(类似于使用“b”修饰符打开的普通文件)。类文件对象的初始内容可以用string参数指定(应该是普通字符串 forStringIO或字节对象 for StringIO or bytes object for BytesIO)。所有常用的文件方法,如read(), write(), seek(), flush(), close() 都可用于这些对象,此外,还有以下方法:

getvalue()

获取保存数据的底层缓冲区的当前内容。