ex20.py
代码
from sys import argv#导入功能
script, 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 lines:")#打印三行
current_line = 1#设定行数为1
print_a_line(current_line, current_file)
current_line = current_line + 1#设定行数在之前基础上加1
print_a_line(current_line, current_file)
current_line = current_line + 1#设定行数在之前基础上再加1
print_a_line(current_line, current_file)
'''-----------------------------------------------------------------------------'''
'''
1. 在每一行上方添加注释解释它的作用。
2. 每次 print_a_line 运行的时候,你都在传入一个 current_line 变量。写出每一次调用函数
的时候 current_line 等于什么,然后找出它是如何变成 print_a_line 里面的 line_count 的。
第一次行数为1;第二次行数为2;第三次行数为3
current_line => line_count 传参
3. 找出每一个用到函数的地方,然后检查它的 def 确保你给出了正确的参数。
4. 在网上搜搜 seek 这个函数的作用。试着输入 pydoc file ,看看你能否从这里看明白。然后
试着输入 pydoc file.seek 再看看 seek 是用来干嘛的。
Python 文件 seek() 方法用于移动文件读取指针到指定位置。
5. 搜一下简化符号 += ,然后用 += 重新写这个脚本。
a += 1 等于 a = a + 1
'''
运行结果
问题
在 print_all 和其他函数里的 f 是什么东西?
f 是一个变量,就像你在练习 18 中函数的变量一样,只不过这次它是一个文件。文件在 Python 里面有点类似于一个老式电脑里面的磁带驱动器,或者一个DVD 播放机。它有一个“读取头”(read head),你可以在文件里 seek (寻找)这个读取头所在的位置,然后在那里工作。每次你做 f.seek(0) 的时候你都会从移动到文件最开始,每次你做f.readline() 的时候,你都在从文件里读取一行内容,并且把读取头移动到 \n 后面,也就是每行结束的地方。 我会在后面给你做更详细的解释。
为什么 seek(0) 没有把 current_line 设置为 0?
首先, seek() 函数处理的是字节(bytes),不是行。 seek(0) 这个代码把文件移动到 0 字节(也就是第一个字节处)。其次, current_line 只是一个变量并且跟这个文件没有任何实际联系。我们是在手动累加它。
什么是 += ?
你知道在英语里我们可以把 “it is” 写成 “it’s” ,或者把 “you are” 写成“you’re” ,这叫缩写(contraction)。而 += 就像 = 和 + 两种运算的缩写。也就是 x = x + y 就等同于 x += y 。
readline() 是怎么知道每一行在哪儿的?
readline() 里面的代码能够扫描文件的每个字节,当它发现一个 \n 字符,它就会停止扫描这个文件,然后回到它发现的地方。文件 f 就负责在每次调用readline() 之后维持文件的当前位置,以此来保证它能阅读到每一行。
为什么文件中的行之间会有空行?
readline() 函数返回文件中每行最后的 \n 。又在 print 函数的结尾加上一个 end = " " 来避免给每行加上两个 \n 。