原文链接: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()的时候继续读取文件的下一行。