我的朋友正在尝试创建一个程序,他希望能够根据int变量设置为0
或1
来输出正常文本和使用Rot13编码的文本之间切换。我们已经使用"text".encode('rot13')
进行了测试,并且可以对文本进行编码,但必须有一种更简单的方法,使用rot13编写程序输出编码的任何内容,而不是使用if 0, output text, if 1, output rot13 text
包装文本输出的每个实例。
我希望会有某种编码,我可以将所有代码包装起来以使其工作,但我尝试在线搜索并找不到任何东西。任何帮助都将非常感谢。
答案 0 :(得分:1)
您可以像这样重定向输出:
import sys
old_stdout = sys.stdout
class MyOut(object):
def write(self, string):
# Do what ever you want with the string
old_stdout.write(string.upper())
def flush(self):
pass
sys.stdout = MyOut()
print "Hello world!"
上面的脚本将为您提供HELLO WORLD!
输出。
答案 1 :(得分:1)
我强烈建议不要修补sys.stdout
或sys.stderr
,这是一种不好的做法,因为它可能会破坏您正在使用的其他模块或其他使用您的模块代码。
更安全的方法是将logging模块的StreamHandler与codecs module's encoded writer结合使用,将编码后的消息打印到默认的stdout
或stderr
处理程序:
import logging
# import codecs # not necessary, this is embedded in logging
# import sys # not necessary, this is embedded in logging
# get your encoding flag here...
flag = 1
# Log everything, and send it to stderr.
# create an encoded streamhandler with encoding based on flag
if flag == 1:
writer = logging.codecs.getwriter('rot13')(logging.sys.stderr)
streamhandler = logging.StreamHandler(stream = writer)
else:
streamhandler = logging.StreamHandler() # defaults to unencoded stderr
# you can use sys.stdout instead,
# it depends on preference and use case
# set the log level threshold
streamhandler.setLevel(logging.DEBUG)
# create a basic logger
log = logging.getLogger()
log.setLevel(logging.DEBUG)
log.addHandler(streamhandler)
# now, instead of print, use log.debug(message)
print 'hello world'
log.debug('hello world')
使用日志记录模块的优点是它还允许您使用log.exception(...)
答案 2 :(得分:0)
只需覆盖sys.stdout
。
import sys
# Save the original stdout
original = sys.stdout
# Create our own stdout
class writer(object) :
def write(self, text):
# Do encoding here
#text = rot13encode(text)
original.write(text)
# Override stdout with our stdout
sys.stdout = writer()
# print as usual
print "Hello"