输入和输出概述
程序通过输入接受待处理的数据;然后执行相应的处理;最后通过输出返回处理结果
Python程序通常可以使用下列方式之一实现交互功能;
- 命令行参数
- 标准输入和输出函数
- 文件输入和输出
- 图形化用户界面
命令行参数
sys.argv与命令行参数
命令行参数是Python语言的标准组成。用户在命令行中python程序之后输入的参数,程序中可以通过列表
sys.argv
访问命令行参数。argv[0]
为脚本名,argv[1]
为第一个参数,argv[2]
为第二个参数,以此类推按惯例,命令行输入参数
argv[1]
、argv[2]
等为字符串
,所以如果希望传入的参数为数值,则需要使用转换行数int()
或float()
,将字符串转换为适合类型。
import sys, random
n=int(sys.argv[1])
for i in range(n):
print(random.randrange(0,100))
运行结果:
PS C:\Users\Administrator\Desktop\Test\py\py3> python .\test.py 10
30
93
6
64
55
8
32
64
48
72
argparse模块和命令行参数解析
argparse
模块是用于解析命令的命令行参数,生成帮助信息的Python标准模块。使用argparse模块的基本步骤如下:
- 导入模块
import argparse
- 创建ArgumentParser对象
parser = argparse.ArgumentParser()
- 调用parser对象方法add_argument(),增加要解析的命令参数信息。
parser.add_argument('--length',default=10,type=int,help='长度')
- 调用parser对象方法parser_args()解析命令行参数,生成对应的列表
args = parser.parser_args()
args #输出:Namespace(length=10)
标准输入和标准输出函数
使用Python内置的输入函数
input
和输出函数
input函数格式为:input([prompt])
input函数提示用户输入,并返回用户从控制台输入的内容(字符串)
print函数格式:print(value,...,sep=' ',end='\n',file='sys.stdout',flush=False)
print函数用于打印一行内容,即将多个以分隔符(sep,默认为空格)分隔的值(value,…,以逗号分隔的值)写入到指定文件流(file,默认控制台sys.stdout)。参数end
指定换行符,flush
指定是否强制写入到流
>>> print(1,2,3)
1 2 3
>>> print(1,2,3,sep=',')
1,2,3
>>> print(1,2,3,sep=',',end='.\n')
1,2,3.
>>> for i in range(5):print(i,end=' ')
...
0 1 2 3 4 >>>
>>>
运行时提示输入密码
如果程序在运行时,需要提示用户输入密码,则可以使用模块
getpass
,以保证用户输入的密码在控制台不回显。getpass
模块包含以下两个函数;
getpass.getpass(prompt='Password',stream=None) #提示用户输入密码并返回
getpass.getuser() #获取当前登录用户名
#如果系统不支持不回显,则getpass将导致getpass.GetPassWarning
import getpass
username=input('username: ')
password=getpass.getpass('Please enter password: ')
if username=='mochu7' and password=='m0c1nu7':
print('Login successful!')
else:
print('Login failure!')
运行结果
PS C:\Users\Administrator\Desktop\Test\py\py3> python .\test.py
username: mochu7
Please enter password:
Login successful!
PS C:\Users\Administrator\Desktop\Test\py\py3> python .\test.py
username: mochu7
Please enter password:
Login failure!
PS C:\Users\Administrator\Desktop\Test\py\py3>
文件和文件对象
文件可以看作数据的集合,一般保存在磁盘或其他存储介质上。
文件对象和open函数
内置函数
open()
用于打开或创建文件对象,其语法格式如下:f=open(file,mode='r',buffering=-1,encoding=None)
其中file
是要打开或创建的文件名,如果不在当前路径,需指出具体路径;mode是打开文件的模式;buffering
表示是否使用缓存(默认-1,表示使用系统默认缓冲区大小);encoding
是文件编码。open()返回一个文件对象f
使用open()函数,可以指定打开文件的模式mode为:
r
(只读)、w
(写入,写入前删除旧的内容)、x
(创建新文件,如果文件存在,则导致FileExistsError
)、a
(追加)、b
(二进制文件)、t
(文本文件,默认值)、+
(更新,读写)文件操作函数容易发生异常,而且最后需要关闭打开的文件。故一般使用
try.......except........finally
语句,在try语句块中执行文件相关操作,使用except
捕获可能发生的异常,在finally
语句块中确保关闭打开的文件
try:
f=open(file,mode)#打开文件
except:#捕获异常
#发生异常时执行的操作
finally:
f.close()#关闭打开的文件
文件的打开、写入、读取和关闭
通过内置函数
open()
可创建或打开文件对象;通过文件对象的实例方法write/weitelines
,可写入字符串到文本文件;通过文件对象的实例方法read/readline
,可以读取文本文件的内容;文件读写完成后,应该使用close
方法关闭文件。文本文件对象是可迭代对象,也可以使用
for
循环语句遍历所有的行
import sys
filename=sys.argv[0] #所读取并输出的就是本程序文件test.py
f=open(filename,'r',encoding='utf-8') #打开文件
line_no=0
while True:
line_no+=1 #统计行号
line=f.readline() #读取行信息
if line:
print(line_no,":",line) #输出行号和该行内容
else:
break
f.close() #关闭打开的文件
运行结果:
PS C:\Users\Administrator\Desktop\Test\py\py3> python .\test.py
1 : import sys
2 :
3 : filename=sys.argv[0] #所读取并输出的就是本程序文件test.py
4 : f=open(filename,'r',encoding='utf-8') #打开文件
5 : line_no=0
6 : while True:
7 : line_no+=1
8 : line=f.readline()
9 : if line:
10 : print(line_no,":",line)
11 : else:
12 : break
13 : f.close()
with语句和上下文管理协议
with context [as var]
操作语句
with
语句定义了一个上下文。执行with
语句时,首先调用上下文对象context
的__enter__()
,其返回值赋值给var
;离开with
语句块时,最后调用context
的__enter__()
,确保释放资源文件对象支持使用
with
语句,确保打开的文件自动关闭;
whti open(file,mode) as f:
#操作打开的文件
import sys
filename = sys.argv[0] #所读文件输出的就是本程序文件
line_no = 0 #统计行号
with open(filename,'r',encoding='utf-8') as f: #使用with语句实现上下文管理协议
for line in f:
line_no += 1 #行号计数
print(line_no,":",line) #输出行号和该行内容
f.close()
运行结果:
PS C:\Users\Administrator\Desktop\Test\py\py3> python .\test.py
1 : import sys
2 :
3 : filename = sys.argv[0] #所读文件输出的就是本程序文件
4 : line_no = 0 #统计行号
5 : with open(filename,'r',encoding='utf-8') as f: #使用with语句实现上下文管理协议
6 : for line in f:
7 : line_no += 1 #行号计数
8 : print(line_no,":",line) #输出行号和该行内容
9 : f.close()
PS C:\Users\Administrator\Desktop\Test\py\py3>
标准输入、输出和错误流
标准输入、输出、和错误流文件对象
在程序启动时,Python自动创建并打开三个文件流对象:
标准输入流文件对象
、标准输出流文件对象
、错误流文件对象
。使用
sys
模块的sys.stdin
、sys.stdout
、sys.stderr
,可以查看对应的标准输入
、标准输出
和标准错误
流文件对象。
标准输入流
文件对象默认对应控制台键盘。标准输出流
文件对象和错误输出流
文件对象默认对应于控制台,其区别仅在于后者是非缓冲的
sys.stdout
的对象方法write()
用于输出对象的字符串表示到标准输出。事实上,print函数就是调用sys.stdout.write()
方法
>>> import sys
>>> print("An error message",file=sys.stdout)
An error message
>>> sys.stdout.write('Another error message\n')
Another error message
22
>>>
读取任意长度的输入流
程序可以从输入流(sys.stdin)中读取数据直至输入流为空。理论上,输入流的大小没有限制。现代操作系统通常使用组合键
Ctrl+D
,指示输入流结束(也有操作系统使用组合键,Ctrl+Z
,例如windows系统)与使用命令行参数对比,标准输入允许用户与程序进行交互(使用命令行参数时只能在程序运行前为程序员提供数据),且可读大量数据(使用命令行参数时有长度限制)。
使用标准流输入还可以通过操作系统系统重定向标准输入的源(例如文件或其他程序的输出),从而实现输入的灵活性
import sys
total = 0.0
count = 0
for line in sys.stdin:
count += 1
total += float(line)
avg = total / count
print('平均值:',avg)
运行结果:
PS C:\Users\Administrator\Desktop\Test\py\py3> python .\test.py
7
8
9
10
11
12
13
14
15
16
17
^Z
平均值: 12.0
PS C:\Users\Administrator\Desktop\Test\py\py3>
标准输入、输出和错误流重定向
通过设置
sys.stdin
、sys.stdout
和sys.stderr
,可以实现标准输入、输出和错误流重定向
f = open('out.log','w')
sys.stdout =f
恢复标准输入,输出和错误流为默认值的代码如下:
sys.stdin = sys.__stdin__
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
重定向和管道
标准输入和标准输出对应与输入和输出流。,默认情况下,键盘是标准输入流,显示屏是标准输出流。因此,默认情况下,标准输入来自键盘的输入,而将标准输出结果发送到显示屏。
然而通过在控制台键盘输入数据,不适合大量数据的情况,且每次运行都需要重新输入数据。现代操作系统都提供了标准输入和输出的重定向功能,把标准输入和标准输出关联的默认设备改变为另一文件、一个网络、一个程序等。
通过重定向,可以实现标准输入和标准输出的抽象,并通过操作系统为标准输入或标准输出指定不同源。
重定向标准输出到一个文件
通过在执行程序的命令后面添加重定向指令,可以将标准输出重定向到一个文件。程序将标准输出的结果写入到指定文件,可以实现永久存储。
程序 > 输出文件
其目的是将显示屏从标准输入中分离,并将
输出文件
与标准输出关联,即程序
的制定结果写入到输出文件
,而不是发送到显示屏中显示
PS C:\Users\Administrator\Desktop\Test\py\py3> python .\test.py >..\..\test.txt
PS C:\Users\Administrator\Desktop\Test\py\py3> cd ../../
PS C:\Users\Administrator\Desktop\Test> type .\test.txt
0
1
2
3
4
5
6
7
8
9
PS C:\Users\Administrator\Desktop\Test>
重定向文件到标准输入
通过在执行程序的命令后面添加重定向指令,可以实现程序从文件读取输入数据,以代替从控制台程序中输入数据
程序 < 输入文件
其目的是将控制台键盘从标准输入中分离,并将
输入文件
与标准输入流
关联,即程序
从输入文件
中读取输入数据,而不是从键盘读取输入数据。重定向文件到输入的功能可以实现
数据驱动的代码
,既不用修改程序,即可以实现处理不同数据文件。即将数据保存在文件中,通过编写程序从标准输入中读取数据
管道
通过管道操作,可以指定一个程序的输出为另一程序的输入。即将一个程序的标准输出与另一个程序的标准输入相连,这种机制称为
管道
程序1 | 程序2 | ... | 程序n
其目的是
程序1
的标准输出连接到程序2
的标准输入。即将程序2
标准输出连接到程序3的标准输入,依次类推使用管道更加简洁优雅,且不用创建中间文件,从而消除了输入流和输出流可以处理的数据大小的限制我,执行效率更高
过滤器
现代操作系统中,使用管道作为命令机制可以将多个程序串联起来,每个程序可以视为一个过滤器,过滤器通过某种形式将标准输入流转换为标准输入流