Python 如何将打印输出重定向到TXT文件

Python 如何将打印输出重定向到TXT文件,python,printing,redirect,Python,Printing,Redirect,我搜索了Google、Stack Overflow和我的Python用户指南,没有找到一个简单可行的答案 我在Windows7x64机器上创建了一个文件c:\goat.txt,并试图将“test”打印到该文件中。根据StackOverflow上提供的示例,我尝试了以下方法: 在这一点上,我不想使用日志模块,因为我从的文档中不了解如何基于二进制条件创建简单日志。打印很简单,但是如何重定向输出并不明显 一个简单、清晰的例子,我可以进入我的对话是最有帮助的 此外,任何关于信息网站的建议(不是pydoc

我搜索了Google、Stack Overflow和我的Python用户指南,没有找到一个简单可行的答案

我在Windows7x64机器上创建了一个文件c:\goat.txt,并试图将“test”打印到该文件中。根据StackOverflow上提供的示例,我尝试了以下方法:

在这一点上,我不想使用日志模块,因为我从的文档中不了解如何基于二进制条件创建简单日志。打印很简单,但是如何重定向输出并不明显

一个简单、清晰的例子,我可以进入我的对话是最有帮助的

此外,任何关于信息网站的建议(不是pydocs)都将不胜感激


如果您使用的是Python 2.5或更早版本,请打开该文件,然后在重定向中使用file对象:

log = open("c:\\goat.txt", "w")
print >>log, "test"
如果您使用的是Python 2.6或2.7,则可以使用print作为函数:

from __future__ import print_function
log = open("c:\\goat.txt", "w")
print("test", file = log)
如果您使用的是Python 3.0或更高版本,那么您可以省略将来的导入

如果要全局重定向打印语句,可以设置sys.stdout:

import sys
sys.stdout = open("c:\\goat.txt", "w")
print ("test sys.stdout")

要重定向所有打印的输出,可以执行以下操作:

import sys
with open('c:\\goat.txt', 'w') as f:
    sys.stdout = f
    print "test"

将sys.stdout重定向到打开的文件句柄,然后将所有打印输出转到一个文件:

import sys
filename  = open("outputfile",'w')
sys.stdout = filename
print "Anything printed will go to the output file"
一种稍显粗糙的方法(与上面的答案不同,这些答案都是有效的)是通过控制台将输出直接导入到一个文件中

想象一下你有
main.py

if True:
    print "hello world"
else:
    print "goodbye world"
你能行

python main.py >> text.log
然后text.log将获得所有输出


如果您已经有一堆打印语句,并且不想单独将它们更改为打印到特定文件,那么这非常方便。只需在上层执行此操作,并将所有打印指向一个文件(唯一的缺点是您只能打印到一个目标)。

使用
print
函数中的
file
参数,每次打印可以有不同的文件:

print('Redirect output to file', file=open('/tmp/example.log', 'w'))

基于前面的答案,我认为这是一个完美的(简单的)上下文管理器风格的用例:

import sys

class StdoutRedirection:
    """Standard output redirection context manager"""

    def __init__(self, path):
        self._path = path

    def __enter__(self):
        sys.stdout = open(self._path, mode="w")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        sys.stdout.close()
        sys.stdout = sys.__stdout__
然后:

with StdoutRedirection("path/to/file"):
    print("Hello world")
另外,在Python3.6中,向StdoutRedirection类添加一些功能(例如,允许更改路径的方法)也非常容易 我在寻找类似Perl的东西

my $printname = "outfile"

open($ph, '>', $printname)
    or die "Could not open file '$printname' $!";

print $ph "hello world\n";

请添加
encoding=“utf-8”
,以避免出现“'charmap'编解码器无法对位置12-32中的字符进行编码:字符映射到”的错误。

此外,您正在使用什么教程?“搜索小时数而无结果”应替换为“在教程中搜索小时数”。你打开过任何教程吗?如果是,是哪一个?导入此打印函数会使我的其他打印语句出错。打印“正在启动LfD…”语法错误:无效syntax@BenBlumer:这是一个很好的观点;您应该只在希望将所有打印语句转换为函数调用的文件中执行打印函数的未来导入。要重置回stdout,请使用代码:
sys.stdout=sys.\uu stdout\uuuu
实际上,在3.0或更高版本中,您可以将文件作为关键字arg:
和open('myfile','w')作为f:print提供(“我的示例”,file=f)
之后,您可以使用以下命令将标准输出设置回原始状态:
sys.stdout=sys.\uu stdout\uuuu
当我运行“sys.stdout=filename”时,最好重新分配其默认值,程序冻结,不确定出了什么问题。可能必须将stdout分配给缓冲区指针本身,而不是引用。如果以交互方式键入python解释器,请不要尝试重新分配sys.stdout,因为您将不再看到解释器的任何输出。因为它使用stdout。还有-不要锯掉你坐的任何树枝。:-)因此,除此之外,我在PyCharm的运行配置中添加了一个“启动前”脚本,它在python覆盖旧的text.log/output.log之前,将text.log/output.log的内容复制到一个文件“concatenated_output.log”。这样您就有了一个工作历史日志(在我的情况下,日志记录包不起作用)。提示:确保在输出中的某个位置打印日期+时间
o = open('outfile','w')

print('hello world', file=o)

o.close()
my $printname = "outfile"

open($ph, '>', $printname)
    or die "Could not open file '$printname' $!";

print $ph "hello world\n";
from __future__ import print_function
log = open("s_output.csv", "w",encoding="utf-8")
for i in range(0,10):
   print('\nHeadline: '+l1[i], file = log)