如何将Python屏幕输出保存为文本文件

23 投票
12 回答
208845 浏览
提问于 2025-04-18 15:14

我想从一个字典中查询一些项目,并把打印的结果保存到一个文本文件里。

这是我现在的代码:

import json
import exec.fullog as e

inp = e.getdata() #inp now is a dict() which has items, keys and values.

#Query

print('Data collected on:', inp['header']['timestamp'].date())
print('\n CLASS 1 INFO\n')

for item in inp['Demographics']:
    if item['name'] in ['Carly', 'Jane']:
        print(item['name'], 'Height:', item['ht'], 'Age:', item['years'])

for item in inp['Activity']:
    if item['name'] in ['Cycle', 'Run', 'Swim']:
        print(item['name'], 'Athlete:', item['athl_name'], 'Age:', item['years'])

12 个回答

5

这里有一个非常简单的方法,适用于 Python 3 及以上版本:

f = open('filename.txt', 'w')
print('something', file = f)

这个方法是从这个回答中找到的:https://stackoverflow.com/a/4110906/6794367

5

你问的问题并不是不可能,但可能并不是你真正想要的。

与其试图把屏幕上的输出保存到文件里,不如直接把输出写入文件,而不是显示在屏幕上。

可以这样做:

with open('outfile.txt', 'w') as outfile:
    print >>outfile, 'Data collected on:', input['header']['timestamp'].date()

只需在所有的打印语句后面加上 >>outfile,并确保所有内容都在那个 with 语句下面缩进。


更一般来说,使用字符串格式化会比神奇的 print 逗号更好,这样你就可以使用 write 函数了。例如:

outfile.write('Data collected on: {}'.format(input['header']['timestamp'].date()))

不过,如果 print 在格式化方面已经满足你的需求,你可以暂时继续使用它。


如果你有一个别人写的 Python 脚本(或者更糟糕的是,一个你没有源代码的编译 C 程序),而无法进行这些修改,那你可以用另一个脚本把它包裹起来,捕获它的输出,使用 subprocess 模块。再次强调,你可能并不想这样做,但如果你确实需要:

output = subprocess.check_output([sys.executable, './otherscript.py'])
with open('outfile.txt', 'wb') as outfile:
    outfile.write(output)
24

一个简单粗暴的方法可以在脚本内部实现这个功能,就是把屏幕输出直接写到一个文件里:

import sys 

stdoutOrigin=sys.stdout 
sys.stdout = open("log.txt", "w")

然后在代码的最后再把输出改回到屏幕上:

sys.stdout.close()
sys.stdout=stdoutOrigin

这个方法适合简单的代码,但如果你的代码比较复杂,还有其他更正式的做法,比如使用Python的日志功能

26

abarnert的回答非常好,而且符合Python的风格。还有一种完全不同的方法(不是用Python),就是让bash来帮你处理这个问题:

$ python myscript.py > myoutput.txt

这个方法通常可以把任何命令行程序(比如Python、Perl、PHP、Java、二进制文件等等)的所有输出都保存到一个文件里。想了解更多,可以查看这个链接:如何将bash脚本的全部输出保存到文件

如果你想让输出同时显示在屏幕上和保存到文件里,可以使用tee命令:

$ python myscript.py | tee myoutput.txt

想了解更多关于tee的内容,可以查看这个链接:如何将输出重定向到文件和屏幕

21

让我来总结一下所有的回答,并补充一些内容。

  • 如果你想在脚本中写入文件,可以使用Python提供的文件输入输出工具(这就是 f=open('file.txt', 'w') 的用法)。

  • 如果你不想修改你的程序,可以使用流重定向(在Windows类Unix系统上都可以)。这就是 python myscript > output.txt 的用法。

  • 如果你想同时在屏幕上和日志文件中看到输出,并且你使用的是Unix系统,又不想修改程序,可以使用tee命令Windows版本也有,但我从来没用过)。

  • 还有更好的方法可以将你想要的输出发送到屏幕、文件、电子邮件、推特等等,那就是使用日志模块。虽然学习这个的难度是所有选项中最大的,但从长远来看,它会带来很大的好处。

撰写回答