如果不採用''.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'並不需要重新實現或替換它,我認爲這更接近這個問題的最小意圖。我可以看到這個答案如何滿足不同類型的最小盡管,所以謝謝你的貢獻! –