如何将Python屏幕输出保存为文本文件
我想从一个字典中查询一些项目,并把打印的结果保存到一个文本文件里。
这是我现在的代码:
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 个回答
这里有一个非常简单的方法,适用于 Python 3 及以上版本:
f = open('filename.txt', 'w')
print('something', file = f)
这个方法是从这个回答中找到的:https://stackoverflow.com/a/4110906/6794367
你问的问题并不是不可能,但可能并不是你真正想要的。
与其试图把屏幕上的输出保存到文件里,不如直接把输出写入文件,而不是显示在屏幕上。
可以这样做:
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)
一个简单粗暴的方法可以在脚本内部实现这个功能,就是把屏幕输出直接写到一个文件里:
import sys
stdoutOrigin=sys.stdout
sys.stdout = open("log.txt", "w")
然后在代码的最后再把输出改回到屏幕上:
sys.stdout.close()
sys.stdout=stdoutOrigin
这个方法适合简单的代码,但如果你的代码比较复杂,还有其他更正式的做法,比如使用Python的日志功能。
abarnert
的回答非常好,而且符合Python的风格。还有一种完全不同的方法(不是用Python),就是让bash来帮你处理这个问题:
$ python myscript.py > myoutput.txt
这个方法通常可以把任何命令行程序(比如Python、Perl、PHP、Java、二进制文件等等)的所有输出都保存到一个文件里。想了解更多,可以查看这个链接:如何将bash脚本的全部输出保存到文件。
如果你想让输出同时显示在屏幕上和保存到文件里,可以使用tee命令:
$ python myscript.py | tee myoutput.txt
想了解更多关于tee的内容,可以查看这个链接:如何将输出重定向到文件和屏幕
让我来总结一下所有的回答,并补充一些内容。
如果你想在脚本中写入文件,可以使用Python提供的文件输入输出工具(这就是
f=open('file.txt', 'w')
的用法)。如果你不想修改你的程序,可以使用流重定向(在Windows和类Unix系统上都可以)。这就是
python myscript > output.txt
的用法。如果你想同时在屏幕上和日志文件中看到输出,并且你使用的是Unix系统,又不想修改程序,可以使用tee命令(Windows版本也有,但我从来没用过)。
还有更好的方法可以将你想要的输出发送到屏幕、文件、电子邮件、推特等等,那就是使用日志模块。虽然学习这个的难度是所有选项中最大的,但从长远来看,它会带来很大的好处。