我正在学习使用Python中的streams,我注意到IO docs表示如下:
The easiest way to create a binary stream is with open() with 'b' in the mode string:
f = open("myfile.jpg", "rb")
In-memory binary streams are also available as BytesIO objects:
f = io.BytesIO(b"some initial binary data: \x00\x01")
由open
定义的f
与由BytesIO
定义的f
之间的区别是什么。换句话说,“内存中的二进制流”是由什么构成的?它与open
的功能有什么不同?
使用
open
在硬盘上打开一个文件。根据使用的模式,您可以从磁盘读取或写入(或同时读取和/或写入)。BytesIO
对象与磁盘上的任何实际文件都没有关联。它只是一块内存,其行为类似于文件。它与从open
返回的文件对象具有相同的API(使用模式r+b
,允许读取和写入二进制数据)。BytesIO
(而且它是近亲StringIO
,始终处于文本模式)在需要将数据传递到或从期望给定文件对象但希望直接传递数据的API传递数据时非常有用。在将输入数据提供给库之前,可以将其加载到BytesIO
中。在它返回之后,您可以使用getvalue()
方法从BytesIO
中获取库写入文件的任何数据。(当然,通常你只需要做其中一个。)为了简单起见,现在让我们考虑写作而不是阅读。
所以当你用
open()
比如说:执行后,将创建名为
test.dat
的文件,其中包含Hello World
。数据写入文件后不会保存在内存中(除非用名称保存)。现在当你考虑
io.BytesIO()
时:它不是将内容写入文件,而是写入内存缓冲区。换句话说就是一块内存。基本上,写下以下内容是等效的:
对于带有with语句的示例,最后还会有一个
del buffer
。这里的关键区别在于优化和性能。
io.BytesIO
能够进行一些优化,使其比简单地逐个连接所有b"Hello World"
更快。为了证明这是一个小基准:
除了性能提高之外,使用
BytesIO
而不是连接还具有BytesIO
可以代替文件对象的优点。假设有一个函数需要一个文件对象写入。然后你可以给它一个内存缓冲区而不是一个文件。区别在于
open("myfile.jpg", "rb")
只是加载并返回myfile.jpg
的内容;而BytesIO
又是一个包含一些数据的缓冲区。由于
BytesIO
只是一个缓冲区-如果以后要将内容写入文件,则必须执行以下操作:另外,您没有提到版本;我使用的是Python3。与示例相关:我使用with语句而不是调用
f.close()
从磁盘读取文件中的字节,并将该值分配给被Python保存在内存中的被引用为“f”的对象。
将字节流值赋给被引用为“f”的对象,该对象由Python保存在内存中。
相关问题 更多 >
编程相关推荐