用于写入多个流的包装器

bri*_*rns 5 python file-io

在Python中,是否有一种简单的方法来设置一个类似文件的对象来进行写入,该对象实际上由多个输出流支持?例如,我想要这样的东西:

file1 = open("file1.txt", "w")
file2 = open("file2.txt", "w")
ostream = OStreamWrapper(file1, file2, sys.stdout)

#Write to both files and stdout at once:
ostream.write("ECHO!")
Run Code Online (Sandbox Code Playgroud)

所以我正在寻找的是OStreamWrapper. 我知道编写自己的代码非常容易,但如果有现有的,我宁愿使用它,而不必担心查找和覆盖边缘情况。

rec*_*dev 3

包装所有公共file函数的方法:

import sys

def _call_for_all_streams(func_name):
    def wrapper(self, *args, **kwargs):
        result = []
        for stream in self._streams:
            func = getattr(stream, func_name)
            result.append(func(*args, **kwargs))
        return result
    return wrapper

class OStreamWrapper(object):
    def __init__(self, *streams):
        self._streams = streams

for method in filter(lambda x: not x.startswith('_'), dir(file)):
    setattr(OStreamWrapper, method, _call_for_all_streams(method))

if __name__ == '__main__':
    file1 = open("file1.txt", "w")
    file2 = open("file2.txt", "w")
    ostream = OStreamWrapper(file1, file2, sys.stdout)
    ostream.write("ECHO!")
    ostream.close()
Run Code Online (Sandbox Code Playgroud)

但有点脏。

  • 请注意,当您“close()”时,此解决方案会关闭传递给“OStreamWrapper”的所有文件。如果操作完成后还想继续写入该文件(例如其中一个文件是“sys.stdout”),就会造成麻烦。 (2认同)