Python自学笔记---15.标准输入,输出和错误

标准输入,输出和错误

解释器提供了3种标准文件对象,分别为标准输入、标准输出和标准错误,他们在sys模块中分别以sys.stdin、sys.stdout和sys.stderr的形式提供。

以如下代码为例写入标准输出并从标准输入中读取一行输入:

mport sys
sys.stdout.write("Enter your words:")
name = sys.stdin.readline()
sys.stdout.write(name) #通过标准输出打印

在python3中还有一个函数可以用于读取文本”input()”,但是他不同于stdin的地方在于:读取的行不包含行末的换行符,这与直接从sys.stdin读取不同。在sys.stdin中,换行符都包含在输入文本中。

name = input("Enter your words:")

标准输入输出的值

在解释器启动时,sys.stdin、sys.stdout和sys.stderr的原始值可以分别在sys.__stdin__、sys.__stdout__和sys.__stderr__中获得。
在某些情况下我们可能需要修改这些标准输入标准输出的值,来达到重定向的目的,下面我们就实例讲解这种方法。

从控制台重定向到文件

原始的sys.stdout指向控制台,如果把文件的对象引用赋值给sys.stdout,那么print调用的就是文件对象的write方法了,请看如下实例:

#首先我们创建一个文件"test1.log"
#然后将标准输出重定向到这个文件上
#最后对这个文件执行一些print操作
#再将写入到文件中的值打印出来


path = 'F:/professional_path/Python/Python36/mycode/test1.log'

temp = sys.stdout  #将sys.stdout的原始值保存起来
fd = open(path, 'w')
sys.stdout = fd   #重定向
print('test word~')
fd.close()

sys.stdout = temp #恢复到重定向之前
fb = open(path, 'r')

for line in fb:
    print(line)

fb.close() #每次打开文件后都需要对应的close文件,这是必须的

如果你在重定向之后还需要在控制台上打印一些东西的话,最好先将原始的控制台引用对象保存下来,向文件中打印之后再恢复 sys.stdout

同时重定向到控制台和文件

如果我们希望打印的内容一方面输出到控制台,另一方面输出到文件作为日志保存,那该怎么办?将打印的内容保留在内存中,而不是已打印就将buffer释放刷新,那么放到一个字符串区域中会怎样?请看如下代码

import sys
class __redirection__:

    def __init__(self):
        self.buff = ''   #申请一个空的buff
        self.__console__ = sys.stdout  #将sys.stdout的原始值保存起来

    def write(self, output_stream):
        self.buff += output_stream   #写操作后将buffer保存起来


    def to_console(self):
        sys.stdout = self.__console__  #定向到控制台 
        print(self.buff)

    def to_file(self, path):
        f = open(path, 'w')
        sys.stdout = f    #重定向了标准输出
        print(self.buff)
        f.close()

    def flush(self):
        self.buff = ''

    def reset(self):
        sys.stdout = self.__console__


if __name__ == "__main__":

    #redirection
    r_obj = __redirection__()
    sys.stdout = r_obj

    #get output stream
    print('hello')
    print('qqqqqqqq')

    #redirect to file
    r_obj.to_file('F:/professional_path/Python/Python36/mycode/out.log')
    #print('test world to out.log')

    #如果在这里调用r_obj.flush()则就不会打印全部的数据流
    r_obj.to_console() #重新定向到控制台
    print('test world to out.log') #将缓冲流中的数据全部打印出来

    #flush buffer
    r_obj.flush()

    #reset
    r_obj.reset() #将标准输出恢复到控制台

总结

  • 本小节我们学习了python中的标准输入、标准输出和标准出错
  • 然后扩展了其重定向的方法
  • 最后一个部分使用代码实例讲述了如何同时重定向到控制台和文件

你可能感兴趣的:(Python自学笔记)