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或字节对象 forStringIO
or bytes object forBytesIO
)。所有常用的文件方法,如read()
,write()
,seek()
,flush()
,close()
都可用于这些对象,此外,还有以下方法:-
getvalue
()¶ 获取保存数据的底层缓冲区的当前内容。
-