描述
sys.stdin ---- 标准输入函数,类似于input()
sys.stdput----标准输出函数,类似于print()
sys.stderr----标准错误输出函数
实际上,input()和print()都是通过调用标准流实现,sys.stdin和sys.stdout实质上不过是两个interface接口,用于切换不同i/o
sys.stdin vs input()
- sys.stdin.readline() 用于读取一行文本输入,直到按回车,注意,使用该函数时,回车符也被读入
>>> import sys
>>> l=sys.stdin.readline()
123
>>>print(l)
# 输出 '123\n'
>>> len(l)
# 输出 4
- sys.stdin.readlines() 用于读取多行文本输入,按下 回车 后,无法退出输入,需要 再 按下 Ctrl+z 然后 再按 回车
>>>import sys
>>>> i=sys.stdin.readlines()
1
2
3
a
b
c
^Z
>>> print(i)
['1\n', '2\n', '3\n', 'a\n', 'b\n', 'c\n']
- input() 用于读取一行文本输入,回车符结束输入,但是不会被包含在输入内
>>> input()
i love wjl
'i love wjl' #输出
- 总结:
- sys.stdin的两种输入都会包含回车,而input()不会
- sys.std和input() 两种输入的返回对象都是字符型,可以通过int()、floadt() 等 进行强制类型转换
- sys.sydin消去换行符:
- 法一:sys.stdin.readline().strip(’/n’)
- 法二:sys.stdin.readline()[:-1]
sys.stdout vs print()
- print:python在调用print的过程中,实际上是引用了sys.stdout.write(obj+’/n’)
即 print()结束时默认换行,若想实现不自动换行,可使用print(param,end=’ ') - sys.stdout.write() 方法把字符写入到标准输出中,也就是控制台。
该方法默认不换行,若想实现换行,可使用sys.stdout.write(‘str/n’) - 区别:print()几乎可以打印所有类型的数据,但是sys.stdout.write()只接受字符型数据
eg:
>>> a=1
>>> type(a)
<class 'int'>
>>> sys.stdout.write(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: write() argument must be str, not int
>>> print(a)
1
- 重定向
1、重定向流到文件或程序
在Windows和类Unix平台下,可以利用shell语法< filename
把标准输入流重定向到文件输入
eg:
假设已有Input.txt这样一个文本文件,现查看其中内容(type 是Windows下命令行命令,功能是显示文件内容)
C:\Users\Administrator>type input.txt
8
6
以下是一个示例脚本,命名为 test.py
def interact():
print('Hello stream world') #正常输出
while True:
try:
reply=input('Enter a number >') #输入(读取)来自sys.stdin的数据(也就是标准输入流的数据)
except EOFError: #当文件结束时,抛出异常,结束循环
break
else:
num=int(reply)
print("%d squared is %d" % (num,num**2))
print('Bye')
if __name__=='__main__':
interact()
接下来,在命令行里正常运行test.py
:
C:\Users\Administrator>python test.py # 路径因人而异
Hello stream world
Enter a number >8 #输入8
8 squared is 64
Enter a number >6 #输入6
6 squared is 36
Enter a number >^Z # ctrl +z 是Windows下的文件结束符
Bye
利用重定向的方式运行该文本:
C:\Users\Administrator>python test.py < input.txt
Hello stream world
Enter a number >8 squared is 64
Enter a number >6 squared is 36
Bye
利用重定向,无需交互式输入
同样,可以利用> filename
将输出重定向到文件
C:\Users\Administrator>python test.py > output.txt #仍需交互式输入,当outpu.txtt不存在时会在当前工作目录(cwd)下自动创建
8
6
^Z
C:\Users\Administrator>type output.txt
Hello stream world
Enter a number >8 squared is 64
Enter a number >6 squared is 36
Bye
也可以在一个命令中把输入输出重定向结合起来,如下所示
C:\Users\Administrator>python test.py < inpu.txt > output.txt
Hello stream world
Enter a number >8 squared is 64
Enter a number >6 squared is 36
Bye
2、利用pipe管道链接程序
在Windows和类Unix平台上,在两个命令之间使用shell字符“|”,可以将前一个程序的标准输出发送到后一个程序的标准输入
eg:假设已有两个py文件----writer.py
& reader.py
C:\Users\Administrator>python writer.py | python reader.py
# 即可将writer.py的输出作为reader.py的输入,记住,要保证前者的输出和后者的输入个数相同
#更简洁的写法:
C:\Users\Administrator> writer.py | reader.py
3、重定向到python对象
法一:自己写一个脚本(名为teststream.py),构造两个接口
import sys
class Output: #模拟输出
def __init__(self):
self.text='' #新建空字符串
def write(self,string):
self.text+=string
def writelines(self,lines):
for line in lines:self.write(line)
class Input: #模拟输入
def __init__(self,input=''): # 默认参数
self.text=input
def read(self,size=None):
if size==None:
res,self.text=self.text,''
else:
res,self.text=self.text[:size],self.text[size:]
return res
def readline(self):
eoln=self.text.find('\n')
if eoln==-1:
res,self.text=self.text,''
else:
res,self.text=self.text[:eoln+1],self.text[eoln+1:]
return res
def redirect(function,pargs,kargs,input): #用于重定向,function是将执行的函数,pargs和kargs是function的可能参数
savestreams=sys.stdin,sys.stdout #用savestreams暂时保当前的流接口
sys.stdin=Input(input) #创建实例,将输入流导到自定义的类实例
sys.stdout=Output() #创建实例,将输出流导到自定义的类实例
try:
result=function(*pargs,**kargs) #运行该函数,允许函数带参数
output=sys.stdout.text # 将输出流中的结果保存到output
finally:
sys.stdin,sys.stdout=savestreams #再把输出输入流重定向到原来的样子
return (result,output)
应用举例:
#已有一个函数test(),内容如下:
def test():
m=input()
print('success:',m)
#测试:
>>>from teststream import redirect
>>>from test import test
>>>(result,output)=redircet(test,(),{},'5') # 输入的5 加不加换行都可以,即'5'和'5\n'效果一样
>>>output
'success: 5\n'
>>> print(output) #print会将换行符转义,输出后 会换行
success: 5
#此行就是换行符的效果
>>>
法二:使用python提供的io模块
详见 这里
法三:利用print调用中的重定向(上个链接中有示例)
语法:
print(content,file=aflie)
说明:
- 利用参数,显示的指定一个文件,所有的输出见那个发送到该文件中
- 所指定的文件是一个对象,而非一个字符串名称
- 该方法不需要保存和重置回原输出流
- 该方法为一次性方法,下次调用print时,若不指定file参数,则仍将输出到标准流
4、利用os.popen重定向子程序流
os.popen----可以在脚本内执行一条shell命令,用于重定向输入流,类似于shell的重定向流到程序的 管道(pipe) 语法(popen即pipe open,意思为管道开放)
eg:
假设已有一个hello-in.py文件,内容如下:
inp=input()
open('hello-in.txt','w').write('hello'+inp+'\n')
利用os.popen重定向子程序流:
>>>import os
>>>pipe=os.popen('python sello-in.py','w') # 在主程序中重定向子程序输入流
>>>pipe.wirte('sue\n')
4
>>>pipe.close() # 可以cclose方法中获取退出状态码,none即没问题
>>>open('hello=in.txt').read()
'hello sue\n'
5、subprocess模块重定向
主要方法:Popen、PIPE(p140)