如何将可迭代对象转换为流?
如果我有一个包含字符串的可迭代对象,是否有一种简单的方法将其转换为流?我想做这样的事情:
def make_file():
yield "hello\n"
yield "world\n"
output = tarfile.TarFile(…)
stream = iterable_to_stream(make_file())
output.addfile(…, stream)
If I've got an iterable containing strings, is there a simple way to turn it into a stream? I want to do something like this:
def make_file():
yield "hello\n"
yield "world\n"
output = tarfile.TarFile(…)
stream = iterable_to_stream(make_file())
output.addfile(…, stream)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
Python 3 有一个新的 I/O 流 API (库文档),替换旧的类似文件的对象协议。 (新的 API 也可以在 Python 2 的
io
模块中找到,并且它向后兼容类文件对象协议。)这是新 API 的实现,使用 Python 2 和 3:
示例 用法:
Python 3 has a new I/O stream API (library docs), replacing the old file-like object protocol. (The new API is also available in Python 2 in the
io
module, and it's backwards-compatible with the file-like object protocol.)Here's an implementation for the new API, in Python 2 and 3:
Example usage:
这是我的流式迭代器,是 urllib3 的实验分支,支持通过可迭代的流式分块请求:
带有上下文的源代码:
https://github.com/shazow/urllib3/blob /filepost-stream/urllib3/filepost.py#L23
相关单元测试:
https://github.com/shazow/urllib3/blob /filepost-stream/test/test_filepost.py#L9
唉,这段代码还没有进入稳定分支,因为对无大小分块请求的支持很差,但它应该是一个很好的基础你正在尝试做的事。请参阅源链接以获取展示如何使用它的示例。
Here's my streaming iterator an experimental branch of urllib3 supporting streaming chunked request via iterables:
Source with context:
https://github.com/shazow/urllib3/blob/filepost-stream/urllib3/filepost.py#L23
Related unit tests:
https://github.com/shazow/urllib3/blob/filepost-stream/test/test_filepost.py#L9
Alas this code hasn't made it into the stable branch yet as sizeless chunked requests are poorly supported, but it should be a good foundation for what you're trying to do. See the source link for examples showing how it can be used.
由于看起来没有“标准”的方法来做到这一点,所以我拼凑了一个简单的实现:
Since it doesn't look like there is a "standard" way of doing it, I've banged together a simple implementation:
一个起点:
A starting point:
对机械蜗牛的答案进行了一点修改。这里,readinto(b) 实现对底层迭代器进行多次调用,以便为给定的可写字节类对象 b
b< 的大小收集尽可能多的字节数。 /代码>。
和用法:
A bit modified version of a great Mechanical snail's answer. Here,
readinto(b)
implementation makes multiple calls to the the underlying iterator, in order to gather as much as possible amount of bytes for the size of the given writable bytes-like objectb
.and usage:
TarFile 接受任何提供类似文件的接口< /a> - 所以你可以使用
StringIO
( <一href="http://docs.python.org/release/3.0.1/library/io.html" rel="nofollow">io.StringIO
如果您使用的是 Python 3.X) 来生成TarFile.addfile()
所需的内容,或者您可以创建自己的类来提供 类似文件的接口并产生您需要的内容。TarFile takes anything that provides a file-like interface -- so you could either use
StringIO
(io.StringIO
if you are using Python 3.X) to yield what you need toTarFile.addfile()
or you could create your own class that provides a file-like interface and yields what you need.