簡介
一些情況下你不得不讓程序與用戶進行交互。例如,你需要從用戶處得到輸入然后輸出計算結果。我們可以分別通過input()和print()函數做到這些。
對於輸出,我們還可以使用str(string)類的各種方法。例如rjust方法可以得到一個指定寬度的右對齊字符串。詳見help(str)。
另一種常見的輸入/輸出類型為文件處理。對於很多程序擁有創建,讀寫文件的能力是必不可少的,我們會在這節探究這些內容。
得到用戶輸入
#!/usr/bin/python
# user_input.py
def reverse(text):
return text[::-1]
def is_palindrome(text):
return text == reverse(text)
something = input('Enter text: ')
if (is_palindrome(something)):
print("Yes, it is a palindrome")
else:
print("No, it is not a palindrome")
輸出:
$ python user_input.py
Enter text: sir
No, it is not a palindrome
$ python user_input.py
Enter text: madam
Yes, it is a palindrome
$ python user_input.py
Enter text: racecar
Yes, it is a palindrome
范例如何工作:
范例中我們使用切片操作反轉文本。之前我們已經學過如何通過seq[a:b](從a開始止於b)對序列切片。
對於切片操作我們還可以指定第三個參數步長,步長默認為1將返回文本的一個連續部分。而給定一個負步長-1將返回反轉后的文本。
input()函數接收一個字符串實參並將其打印給用戶,然后函數等待用戶輸入一些東西,一但用戶按下回車鍵則輸入結束,input函數將返回輸入的文本。
之后我們反轉文本,如果反轉后的文本與原文本相同,則代表它是一個回文(http://en.wiktionary.org/wiki/palindrome)。
練習題:
檢測一個文本是否為回文應該忽略標點,空格和大小寫。
例如”Rise to vote, sit.”同樣是一個回文,但是我們當前的例子無法識別它。你能改善這個例子讓它做都這點嗎?
文件
通過創建file類對象,使用其read, readline或write方法你可以對文件進行讀寫。
具體讀或寫的方式依賴於你打開文件時指定的模式。
最后當你完成文件操作時調用close關閉文件。
范例:
#!/usr/bin/python
# Filename: using_file.py
poem = '''/
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!
'''
f = open('poem.txt', 'w') # 寫模式打開
f.write(poem) # 寫文件
f.close() # 關閉文件
f = open('poem.txt') # 如果沒有提供打開模式, 則默認假設為讀模式
while True:
line = f.readline()
if len(line) == 0: # 長度為0代表EOF(注: end of file即文件尾)
break
print(line, end='')
f.close() # close the file
輸出:
$ python using_file.py
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!
范例如何工作:
首先,我們通過內建函數open打開一個文件,在函數中我們指定了被打開文件的文件名與希望使用的打開模式。
其中打開模式可以為讀模式(‘r’),寫模式(‘w’)或追加模式(‘a’)。另外我們也可以處理文件文件(‘t’)和二進制文件(‘b’)。
實際上還有很多模式可用,詳見help(open)。默認的open將文件對待為文本文件’t’,並以讀模式’r’打開。
在范例中,我們首先以寫文本模式打開文件,使用文件對象的write方法寫文件,並調用close將其關閉。
然后我們再次打開相同的文件用於讀取。這里我們無需指定打開模式因為’讀文本文件’是open的默認模式。
在循環中我們使用readline方法讀取文件的每一行。這個方法返回一整行文本其中包括末尾的換行符。
當返回一個空字符串時,意味着我們已經來到文件尾,因此使用break跳出循環。
默認的,print()函數將自動打印一個換行。因為從文件讀出的文本行末尾已經包含一個換行,所以我們指定參數end=’’抑制換行。
最后我們關閉文件。
現在,檢查poem.txt文件內容以確定程序真的寫入並讀取了文件。
Pickle
python提供了一個名為pickle的標准模塊用於將任意python對象存入文件或從文件中讀出。這被稱做永久性存儲對象(persistently)。
范例:
#!/usr/bin/python
# Filename: pickling.py
import pickle
# the name of the file where we will store the object
shoplistfile = 'shoplist.data'
# the list of things to buy
shoplist = ['apple', 'mango', 'carrot']
# Write to the file
f = open(shoplistfile, 'wb')
pickle.dump(shoplist, f) # 轉儲對象到文件
f.close()
del shoplist # 銷毀shoplist變量
# 從文件找回對象
f = open(shoplistfile, 'rb')
storedlist = pickle.load(f) # 從文件加載對象
print(storedlist)
輸出:
$ python pickling.py
['apple', 'mango', 'carrot']
范例如何工作:
為了將對象存儲到文件,我們必須首先’wb’寫二進制文件模式打開文件然后調用pickle模塊的dump函數。這個過程叫做封藏(pickling)對象。
接下來我們使用pickle的load函數重新找回對象。這個過程叫做解封(unpickling)對象。
小結
我們已經討論了各種形式的輸入/輸出,和利用pickle模塊進行文件處理。
接下來,我們將會學習異常處理。

