輸入和輸出
輸入和輸出概述
程序通過輸入接受待處理的數據;然後執行相應的處理;最後通過輸出返回處理結果
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的標準輸入,依次類推
使用管道更加簡潔優雅,且不用創建中間文件,從而消除了輸入流和輸出流可以處理的數據大小的限制我,執行效率更高
過濾器
現代操作系統中,使用管道作爲命令機制可以將多個程序串聯起來,每個程序可以視爲一個過濾器,過濾器通過某種形式將標準輸入流轉換爲標準輸入流