这可能听起来像一个愚蠢的问题,但我正试图从头开始(IOBase)学习Python文件处理的来龙去龙去。
流和另一个容器对象的真正区别是什么?我对列表(或其他语言中的数组)的理解(诚然是有限的)是,它被实现为一个连续的内存块,很像字符串。
似乎你可以用初始数据创建字节流对象:
f = io.BytesIO(b"some test data")
然后可以逐字节读取。它看起来只是一个字节块,可以像字符串或数组一样读写。
到底是什么让流成为流?
我对抽象概念和实现都很感兴趣。
我知道这可能不是一个明确的问题,但我希望有人能给我一点启发。
虽然流对象类似于像集合,他们支持Iteratable协议,然而,他们并不是意味着用于存储逻辑的完整的数据集,而是一个数据从文件如挑选的一部分,网络套接字,一个字符串或一个web服务,需要执行什么操作,数据的一部分,通过它回到下游这可能是一个文件,一个网络套接字,一个字符串或一个web服务等。其目的不是将整个数据像列表/数组一样存储在内存中,而是只存储迭代对象使用其方法集(例如read, readline等)从数据源(例如文件)获取的部分数据,并使用方法(例如write, writeline等)将其传递回数据接收器。整个数据仍然物理地驻留在数据源和数据接收器驻留的地方,只有一部分由流对象方法获取的数据驻留在执行Python代码的机器的内存中。
流的一个简短而简洁的定义回答了你的问题(到底是什么使流成为流?)在这里的链接:https://en.wikipedia.org/wiki/Stream_(computing)
一个基于文件的流对象的很好的例子在这里的链接:https://gawron.sdsu.edu/python_for_ss/course_core/book_draft/anatomy/files.html
除此之外,与列表/数组等不同,数据不需要采用文本格式。
如果你想看更多实现的整体细节,这里有更多的链接:https://docs.python.org/3/library/io.html#https://docs.python.domainunion.de/3/library/asyncio-stream.html