Python 程式設計/輸入和輸出
Python 3.x 只有一個從使用者獲取輸入的函式,input()。相比之下,舊的 Python 2.x 有兩個從使用者獲取輸入的函式:input() 和 raw_input()。
還有一些非常簡單的方法可以讀取檔案,並且為了更嚴格地控制輸入,可以從 stdin 讀取,如果需要。
在 Python 3.x 中,input() 會向用戶詢問一串資料(以換行符結尾),並簡單地返回該字串。它也可以接受一個引數,該引數在使用者輸入資料之前顯示為提示。例如:
print(input('What is your name?'))
打印出
What is your name? <user input data here>
示例:將使用者的姓名(即字串資料)分配給變數“x”,您將鍵入
x = input('What is your name?')
在舊的 Python 2.x 中,以上適用於raw_input() 函式,並且還有input() 函式,它的行為不同,它會自動評估使用者輸入的內容;在 Python 3 中,可以透過eval(input()) 實現相同的功能。
連結
- input() 在 Python 3 的庫引用中的內建函式中,docs.python.org
- raw_input() 在 Python 2 的庫引用中的內建函式中,docs.python.org
在舊的 Python 2.x 中,input() 將使用者輸入作為字串並對其進行評估。
因此,如果指令碼寫道
x = input('What are the first 10 perfect squares? ')
使用者可以輸入
map(lambda x: x*x, range(10))
這將產生列表形式的正確答案。請注意,任何輸入的語句都不能跨越多行。
input() 不應該用於除最簡單的程式之外的任何程式,出於安全原因。使用諸如以下的習語將從 raw_input() 返回的字串轉換為 Python 型別
x = None
while not x:
try:
x = int(raw_input())
except ValueError:
print('Invalid Number')
是比較好的方法,因為 input() 使用 eval() 將字面量轉換為 Python 型別,這使得惡意人士可以從程式內部輕鬆地執行任意程式碼。
連結
- input() 在 Python 2 的庫引用中的內建函式中,docs.python.org
要從檔案讀取,可以使用open 迭代檔案的行
f = open('test.txt', 'r')
for line in f:
print(line[0])
f.close()
這將列印每行的第一個字元。換行符附加到以這種方式讀取的每一行的末尾。open 的第二個引數可以是 'r'、'w' 或 'rw',以及其他一些引數。
讀取檔案的新方法,也是更好的方法
with open("test.txt", "r") as txt:
for line in txt:
print(line)
優點是開啟的檔案將在with 語句內的部分執行完畢後自動關閉,即使丟擲異常也是如此。
由於檔案在檔案物件超出範圍時會自動關閉,因此實際上沒有必要顯式關閉它們。因此,上一段程式碼中的迴圈也可以寫成
for line in open('test.txt', 'r'):
print(line[0])
您可以一次讀取特定數量的字元
c = f.read(1)
while len(c) > 0:
if len(c.strip()) > 0: print(c)
c = f.read(1)
這將一次讀取 f 中的字元,然後在它們不是空格的情況下列印它們。
檔案物件隱式包含一個標記來表示當前位置。如果檔案標記應該移動回開頭,則可以關閉檔案物件並重新開啟它,或者只需使用以下命令將標記移動回開頭
f.seek(0)
有一些內建檔案物件代表標準輸入、輸出和錯誤。這些物件位於 sys 模組中,分別稱為 stdin、stdout 和 stderr。它們在 __stdin__、__stdout__ 和 __stderr__ 中也有不可變副本。這是為了 IDLE 和其他工具,其中標準檔案已更改。
您必須匯入 sys 模組才能使用特殊的 stdin、stdout、stderr I/O 處理程式。
import sys
為了更精細地控制輸入,請使用 sys.stdin.read()。要實現 UNIX 'cat' 程式,您可以執行以下操作
import sys
for line in sys.stdin:
print(line, end="")
請注意,sys.stdin.read() 將從標準輸入讀取到 EOF。(通常是 Ctrl+D。)
傳遞給 Python 程式的命令列引數儲存在 sys.argv 列表中。列表中的第一個專案是 Python 程式的名稱,它可能包含完整的路徑,也可能不包含,具體取決於呼叫的方式。sys.argv 列表是可修改的。
列印除程式名稱本身以外的所有傳遞的引數
import sys
for arg in sys.argv[1:]:
print(arg)
解析傳遞的引數以查詢傳遞的減號選項
import sys
option_f = False
option_p = False
option_p_argument = ""
i = 1
while i < len(sys.argv):
if sys.argv[i] == "-f":
option_f = True
sys.argv.pop(i)
elif sys.argv[i] == "-p":
option_p = True
sys.argv.pop(i)
option_p_argument = sys.argv.pop(i)
else:
i += 1
在上面,找到選項的引數被刪除,以便可以迴圈遍歷 sys.argv 以獲得所有剩餘的引數。
命令列引數的解析還得到庫模組 optparse(已棄用)、argparse(從 Python 2.7 開始)和 getopt(為了讓 C 程式設計師的生活更輕鬆)的支援。
argparse 的最小解析示例
import argparse
parser = argparse.ArgumentParser(description="Concatenates two strings")
addarg = parser.add_argument
addarg("s1", help="First string to concatenate")
addarg("s2", help="Second string to concatenate")
args = parser.parse_args()
result = args.s1 + args.s2
print(result)
使用 argparse 解析 - 指定 arg 型別為 int
import argparse
parser = argparse.ArgumentParser(description="Sum two ints")
addarg = parser.add_argument
addarg("i1", help="First int to add", type=int)
addarg("i2", help="Second int to add", type=int)
args = parser.parse_args()
result = args.i1 + args.i2
print(result)
使用 argparse 解析 - 新增可選開關 -m 以產生乘法而不是加法
import argparse
parser = argparse.ArgumentParser(description="Sums or multiplies two ints.")
addarg = parser.add_argument
addarg("i1", help="First int", type=int)
addarg("i2", help="Second int", type=int)
addarg("-m", help="Multiplies rather than adds.", action="store_true")
args = parser.parse_args()
if args.m:
result = args.i1 * args.i2
else:
result = args.i1 + args.i2
print(result)
使用 argparse 解析 - 將引數設定為消耗一個或多個專案
import argparse
parser = argparse.ArgumentParser(description="Sums one or more ints.")
addarg = parser.add_argument
addarg("intlist", help="Ints", type=int, nargs="+")
args = parser.parse_args()
result = 0
for item in args.intlist:
result += item
print(result)
用法示例:python ArgparseTest.py 1 3 5
使用 argparse 解析 - 與上面相同,但在引數描述之後新增一個幫助後記,以在 -h 之後輸出
import argparse
parser = argparse.ArgumentParser(description="Sums one or more ints.",
epilog="Example: python ArgparseTest.py 1 3 5")
addarg = parser.add_argument
addarg("intlist", help="Ints", type=int, nargs="+")
args = parser.parse_args()
result = 0
for item in args.intlist:
result += item
print(result)
使用 argparse 解析 - 使第二個整數引數透過 nargs 可選
import argparse
parser = argparse.ArgumentParser(description="Sums one or two integers.",
epilog="Example: python ArgparseTest.py 3 4\n"
"Example: python ArgparseTest.py 3")
addarg = parser.add_argument
addarg("i1", help="First int", type=int)
addarg("i2", help="Second int, optional, defaulting to 1.", type=int, default=1, nargs="?")
args = parser.parse_args()
result = args.i1 + args.i2
print(result)
連結
- Python 標準庫 - 28.1. sys,docs.python.org
- Python 標準庫 - 15.4. argparse,docs.python.org
- Python 標準庫 - 15.5. optparse,docs.python.org
- Python 標準庫 - 15.6. getopt,docs.python.org
- Argparse 教程,docs.python.org
執行輸出的基本方法是使用 print 語句。
print('Hello, world')
要在同一行上列印多個內容,並在它們之間用空格隔開,請在它們之間使用逗號
print('Hello,', 'World')
這將打印出以下內容
Hello, World
雖然兩個字串都不包含空格,但 print 語句由於兩個物件之間的逗號而添加了一個空格。可以列印任意資料型別
print(1, 2, 0xff, 0777, 10+5j, -0.999, map, sys)
這將輸出以下內容
1 2 255 511 (10+5j) -0.999 <built-in function map> <module 'sys' (built-in)>
物件可以在同一行上列印,而無需在同一行上
for i in range(10):
print(i, end=" ")
這將輸出以下內容
0 1 2 3 4 5 6 7 8 9
要在列印行的末尾新增換行符,請新增一個沒有物件的 print 語句。
for i in range(10):
print(i, end=" ")
print()
for i in range(10,20):
print(i, end=" ")
這將輸出以下內容
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
如果沒有該空 print 語句,上面的輸出將如下所示
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
您可以列印到檔案,而不是列印到標準輸出
print('Hello, world', file=f)
這將列印到任何實現 write() 的物件,包括檔案物件。
關於遺留 Python 2 的說明:在 Python 2 中,print 是一個語句而不是一個函式,不需要在它的引數周圍加括號。而不是print(i, end=" "),人們會寫print i,.
在 Python 3.x 中,可以透過將 end="" 傳遞給 print 函式或使用 write 方法來輸出不帶換行符的內容
import sys
print("Hello", end="")
sys.stdout.write("Hello") # Or stderr to write to standard error stream.
在 Python 2.x 中,為了避免在後續 print 語句中使用物件的輸出之間新增空格和換行符,可以執行以下操作之一
串聯:串聯每個物件的字串表示形式,然後將整個內容一次性打印出來。
print(str(1)+str(2)+str(0xff)+str(0777)+str(10+5j)+str(-0.999)+str(map)+str(sys))
這將輸出以下內容
12255511(10+5j)-0.999<built-in function map><module 'sys' (built-in)>
寫入函式:可以為sys.stdout.write建立一個簡寫,並將其用於輸出。
import sys
write = sys.stdout.write
write('20')
write('05\n')
這將輸出以下內容
2005
您可能需要使用 sys.stdout.flush() 以便快速在螢幕上顯示該文字。
使用Python 3.x輸出的示例
- from __future__ import print_function
- 確保 Python 2.6 及更高版本的 Python 2.x 可以使用 Python 3.x print 函式。
- print("Hello", "world")
- 列印用空格隔開的兩個單詞。請注意周圍的括號,在 Python 2.x 中未使用。
- print("Hello world", end="")
- 不帶結尾換行符列印。
- print("Hello", "world", sep="-")
- 用連字元分隔列印兩個單詞。
- print("Hello", 34)
- 列印各種資料型別的元素,用空格分隔它們。
- print("Hello " + 34)
- 由於嘗試連線字串和整數而引發錯誤。
- print("Hello " + str(34))
- 使用“+”連線字串,在將數字轉換為字串之後。
- sum=2+2; print "The sum: %i" % sum
- 列印一個字串,該字串已使用作為引數傳遞的整數進行格式化。另請參見#格式化。
- print ("Error", file=sys.stderr)
- 輸出到檔案控制代碼,在本例中是標準錯誤流。
使用Python 2.x輸出的示例
- print "Hello"
- print "Hello", "world"
- 用空格分隔兩個單詞。
- print "Hello", 34
- 列印各種資料型別的元素,用空格分隔它們。
- print "Hello " + 34
- 由於嘗試連線字串和整數而引發錯誤。
- print "Hello " + str(34)
- 使用“+”連線字串,在將數字轉換為字串之後。
- print "Hello",
- 列印“Hello ”不帶換行符,結尾處帶空格。
- sys.stdout.write("Hello")
- 列印“Hello”不帶換行符。執行“import sys”是先決條件。需要後續的“sys.stdout.flush()”才能立即在使用者的螢幕上顯示。
- sys.stdout.write("Hello\n")
- 列印“Hello”帶換行符。
- print >> sys.stderr, "An error occurred."
- 列印到標準錯誤流。
- sys.stderr.write("Hello\n")
- 列印到標準錯誤流。
- sum=2+2; print "The sum: %i" % sum
- 列印一個字串,該字串已使用作為引數傳遞的整數進行格式化。
- formatted_string = "The sum: %i" % (2+2); print formatted_string
- 與上一個類似,只是格式化發生在 print 語句之外。
- print "Float: %6.3f" % 1.23456
- 輸出“Float: 1.234”。句點後的數字 3 指定小數點後顯示的小數位數,而句點前的數字 6 指定顯示的數字應占用的字元總數,如果需要,將用空格填充。
- print "%s is %i years old" % ("John", 23)
- 將兩個引數傳遞給格式化程式。
將數字從 1 到 10 列印到檔案,每行一個數字
file1 = open("TestFile.txt","w")
for i in range(1,10+1):
print(i, file=file1)
file1.close()
使用“w”,檔案將被開啟以供寫入。使用“file=file1”,print 將其輸出傳送到檔案而不是標準輸出。
將數字從 1 到 10 列印到檔案,用連字元分隔
file1 = open("TestFile.txt", "w")
for i in range(1, 10+1):
if i > 1:
file1.write("-")
file1.write(str(i))
file1.close()
開啟檔案以進行追加而不是覆蓋
file1 = open("TestFile.txt", "a")
在 Python 2.x 中,重定向到檔案是透過以下方式完成的print >>file1, i.
另請參見檔案章節。
使用字串百分號運算子將數字和其他值格式化為字串
v1 = "Int: %i" % 4 # 4
v2 = "Int zero padded: %03i" % 4 # 004
v3 = "Int space padded: %3i" % 4 # 4
v4 = "Hex: %x" % 31 # 1f
v5 = "Hex 2: %X" % 31 # 1F - capitalized F
v6 = "Oct: %o" % 8 # 10
v7 = "Float: %f" % 2.4 # 2.400000
v8 = "Float: %.2f" % 2.4 # 2.40
v9 = "Float in exp: %e" % 2.4 # 2.400000e+00
vA = "Float in exp: %E" % 2.4 # 2.400000E+00
vB = "List as string: %s" % [1, 2, 3]
vC = "Left padded str: %10s" % "cat"
vD = "Right padded str: %-10s" % "cat"
vE = "Truncated str: %.2s" % "cat"
vF = "Dict value str: %(age)s" % {"age": 20}
vG = "Char: %c" % 65 # A
vH = "Char: %c" % "A" # A
使用 format() 字串方法將數字和其他值格式化為字串,自 Python 2.6 起
v1 = "Arg 0: {0}".format(31) # 31
v2 = "Args 0 and 1: {0}, {1}".format(31, 65)
v3 = "Args 0 and 1: {}, {}".format(31, 65)
v4 = "Arg indexed: {0[0]}".format(["e1", "e2"])
v5 = "Arg named: {a}".format(a=31)
v6 = "Hex: {0:x}".format(31) # 1f
v7 = "Hex: {:x}".format(31) # 1f - arg 0 is implied
v8 = "Char: {0:c}".format(65) # A
v9 = "Hex: {:{h}}".format(31, h="x") # 1f - nested evaluation
使用字面字串插值將數字和其他值格式化為字串,自 Python 3.6 起
int1 = 31; int2 = 41; str1="aaa"; myhex = "x"
v1 = f"Two ints: {int1} {int2}"
v2 = f"Int plus 1: {int1+1}" # 32 - expression evaluation
v3 = f"Str len: {len(str1)}" # 3 - expression evaluation
v4 = f"Hex: {int1:x}" # 1f
v5 = f"Hex: {int1:{myhex}}" # 1f - nested evaluation
連結
- 5.6.2. 字串格式化操作,docs.python.org
- 2. 內建函式 # 格式化,docs.python.org
- 7.1.2. 自定義字串格式化,docs.python.org
- 7.1.3.1. 格式規範微語言,docs.python.org
- 7.1.4. 模板字串,docs.python.org
- PEP 3101 -- 高階字串格式化,python.org
- PEP 498 -- 字面字串插值,python.org
- 7. 輸入和輸出 在 Python 教程中,python.org
- 6.6. print 語句 在 Python 語言參考中,python.org
- 2. 內建函式 #open 在 Python 標準庫中,python.org
- 5. 內建型別 #file.write 在 Python 標準庫中,python.org
- 27.1. sys — 系統特定引數和函式 在 Python 文件中,python org -- 提到了 sys.stdout 和 sys.stderr
- 2.3.8 檔案物件 在 Python 庫參考中,python.org,用於“flush”
- 5.6.2. 字串格式化操作 在 Python 標準庫中,python.org -- 用於“%i”、“%s”和類似的字串格式化
- 7.2.2. 字串格式運算子,在 Python 2.5 快速參考中,nmt.edu,用於“%i”、“%s”和類似的字串格式化