输入和输出

  • 输入和输出概述
  • 命令行参数
  • sys.argv与命令行参数
  • argparse模块和命令行参数解析
  • 标准输入和标准输出函数
  • 运行时提示输入密码
  • 文件和文件对象
  • 文件对象和open函数
  • 文件的打开、写入、读取和关闭
  • with语句和上下文管理协议
  • 标准输入、输出和错误流
  • 标准输入、输出、和错误流文件对象
  • 读取任意长度的输入流
  • 标准输入、输出和错误流重定向
  • 重定向和管道
  • 重定向标准输出到一个文件
  • 重定向文件到标准输入
  • 管道
  • 过滤器



输入和输出概述

程序通过输入接受待处理的数据;然后执行相应的处理;最后通过输出返回处理结果

Python学习笔记:输入和输出_Python输入和输出

Python程序通常可以使用下列方式之一实现交互功能;

  1. 命令行参数
  2. 标准输入和输出函数
  3. 文件输入和输出
  4. 图形化用户界面

命令行参数

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模块的基本步骤如下:

  1. 导入模块
    import argparse
  2. 创建ArgumentParser对象
    parser = argparse.ArgumentParser()
  3. 调用parser对象方法add_argument(),增加要解析的命令参数信息。
    parser.add_argument('--length',default=10,type=int,help='长度')
  4. 调用parser对象方法parser_args()解析命令行参数,生成对应的列表
    args = parser.parser_args()args #输出:Namespace(length=10)

标准输入和标准输出函数

使用Python内置的输入函数input和输出函数print,可以使程序与用户进行交互
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.stdinsys.stdoutsys.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.stdinsys.stdoutsys.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的标准输入,依次类推

使用管道更加简洁优雅,且不用创建中间文件,从而消除了输入流和输出流可以处理的数据大小的限制我,执行效率更高

过滤器

现代操作系统中,使用管道作为命令机制可以将多个程序串联起来,每个程序可以视为一个过滤器,过滤器通过某种形式将标准输入流转换为标准输入流