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的標準輸入,依次類推

使用管道更加簡潔優雅,且不用創建中間文件,從而消除了輸入流和輸出流可以處理的數據大小的限制我,執行效率更高

過濾器

現代操作系統中,使用管道作爲命令機制可以將多個程序串聯起來,每個程序可以視爲一個過濾器,過濾器通過某種形式將標準輸入流轉換爲標準輸入流

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章