如何pythonically打印和写入相同的字符串(一个对象上的两个操作)

时间:2014-10-13 17:45:37

标签: python file-io python-2.x

我目前正在这样做,但我觉得有一种更简洁的方法可以做到这一点,因为我正在编辑代码以写入文件所打印的所有内容。以下是否有单行或更简洁的内容?感谢

print 'foo bar'
file.write('foo bar')

4 个答案:

答案 0 :(得分:2)

您可以创建一个类似文件的对象,该对象可以写入许多其他文件:

class Tee(object):
    """A file-like that writes to all the file-likes it has."""

    def __init__(self, *files):
        """Make a Tee that writes to all the files in `files.`"""
        self._files = files

    def write(self, data):
        """Write `data` to all the files."""
        for f in self._files:
            f.write(data)

然后你可以创建一个Tee对象:

tee = Tee(sys.stdout, file)

并写信给你的发球台:

tee.write(data)

,输出将转到文件和stdout。

答案 1 :(得分:0)

这和你一样好 1 - 当然,如果你想要它在一行中,你可以把它包装在一个函数中。 。

def print_and_write(fileobj, data):
    print data
    fileobj.write(data)

1 用于通用代码。对于日志记录的特定情况,您可以使用日志记录模块做得更好,正如其他人在评论中指出的那样

答案 2 :(得分:0)

如果您的用例以任何形式登录,请使用带有multiple destinations的记录器。 在您的情况下,StreamHandler定向到sys.stdoutFileHandler用于记录到文件:

import logging
import sys

logger = logging.getLogger()
logger.setLevel(logging.INFO)

logger.addHandler(logging.FileHandler('out.log'))     # log to file
logger.addHandler(logging.StreamHandler(sys.stdout))  # log to stdout

logger.info('foo bar')

需要一些设置,但之后这个解决方案就像它获得的一样干净,恕我直言。并且线程安全。

答案 3 :(得分:0)

试试这个

import sys

outfile = open("test.txt",'w')

[print("foo bar",file = i) for i in [outfile,sys.stdout]]

outfile.close()