如果不采用''.join
,PyyAML的yaml.load_all
和fileinput.input()
是否有Pythonic的方式来轻松地从多个来源流式传输多个文档?如何将yaml.load_all与fileinput.input一起使用?
我正在寻找类似如下(非工作示例):
# example.py
import fileinput
import yaml
for doc in yaml.load_all(fileinput.input()):
print(doc)
预期输出:
$ cat >pre.yaml <<<'--- prefix-doc'
$ cat >post.yaml <<<'--- postfix-doc'
$ python example.py pre.yaml - post.yaml <<<'--- hello'
prefix-doc
hello
postfix-doc
当然,yaml.load_all
预计是一个字符串,字节,或文件类对象和fileinput.input()
是没有这些东西,所以上述示例不起作用。
实际输出:
$ python example.py pre.yaml - post.yaml <<<'--- hello'
...
AttributeError: FileInput instance has no attribute 'read'
可以使示例工作,''.join
,但那是作弊。我正在寻找一种不会将整个流一次读入内存的方式。
我们可能改写这个问题作为是否有某种方式来模拟一个字符串,字节,或类似文件的对象,代理为一个字符串底层迭代器?但是,我怀疑yaml.load_all
实际上需要整个类似文件的界面,因此,措辞会要求超过严格需要。
理想我正在寻找最小的适配器,将支持这样的事情:
for doc in yaml.load_all(minimal_adapter(fileinput.input())):
print(doc)
这是一个很好的答案,我希望我可以标记多个答案接受(“✅Acceptable”?);然而,另一个解决方案重新使用'fileinput'并不需要重新实现或替换它,我认为这更接近这个问题的最小意图。我可以看到这个答案如何满足不同类型的最小尽管,所以谢谢你的贡献! –