原文鏈接:http://learnpythonthehardway.org/book/ex20.html
記住檢查函數所列的檢查列表,然後做下面這個練習,密切注意怎樣用函數和文件一起來寫一些有用的東西。
from sys import argv
scirpt ,input_file = argv
def print_all(f):
print f.read()
def rewind(f):
f.seek(0)
def print_a_line(line_count ,f):
print line_count ,f.readline()
current_file = open(input_file)
print "First let's print the whole file:\n"
print_all(current_file)
print "Now let's rewind ,kind of like a tape."
rewind(current_file)
print "Let's print three liners:"
current_line = 1
print_a_line(current_line ,current_file)
current_line = current_line + 1
print_a_line(current_line ,current_file)
current_line = current_line + 1
print_a_line = (current_line ,current_file)
留心觀察我們是怎樣每次調用print_a_line函數時向其傳遞當前行數的。
輸出結果如下:
c:\>python ex20.py test.txt
First let's print the whole file:
This is line 1
This is line 2
This is line 3
Now let's rewind ,kind of like a tape.
Let's print three liners:
1 This is line 1
2 This is line 2
3 This is line 3
研究訓練:
學生遇見的常見問題:
在print_all函數和其它函數中 f 是什麼?
答:這個 f 就像你在 Exercise 18裏面函數中的一個變量一樣,只是這裏這個變量是一個文件句柄。一個文件句柄就像一種在主機上被驅動的老式磁帶,或者像一個DVD播放器。它是一個文件的“讀取的頭”,你可以用 "seek"來讀取文件中指定的位置,然後在這個位置做相應操作。你如果每次調用 f.seek(0) 函數,那麼讀取文件的位置將移動到文件開始的地方。每次調用 f.readline()你就將從文件中讀取一行數據,並且將讀取的頭將會移動到這一行最後結尾的\n的右邊。你往下學習的過程會有更多關於這個的解釋。
爲什麼在文件中的行之間有空行?
答:readline() 函數返回了讀取的哪一行最後的 \n 字符。這就意味着由readline()函數讀取返回得到的\n將被打印出來。要改變這種情況很簡單,只要在打印的這一行最後面加上一個逗號(,)它就不會打印出它自己的 \n 了。
爲什麼 seek(0)函數沒有把 current_line 重置爲 0?
答:首先,seek()函數是處理字節的,不是行數。那麼它的作用就是就是讓讀取的頭指向第 0 個字節(文件的第一個字節)。其次,current_line 只是一個變量,跟文件完全沒有任何關聯。我們只是手動的將其遞增操作而已。
+= 是什麼?
答:你知道英語裏面可以將”it is" 簡寫成“it's"嗎?或者我可以將”you are"寫成“you're"?這種寫法叫做縮寫,那麼 += 就是 = 和 + 兩個操作符的一種縮寫形式。x += y 就等同於 x = x+y 。
readline()怎麼知道在哪一行?
答:readline()函數裏面會去掃描文件中的每一個字節知道找到一個 \n 字符,然後停止讀取文件返回此時讀取到的所有數據。而文件句柄 f 在每次調用完readline()函數後負責保持目前讀到的當前位置,這樣的話就可以保證下次繼續調用readline()的時候繼續讀取文件的下一行。