代码如下
from sys import argv
script,input_file = argv,"input_file"
#print_all函数传递了f变量,读取变量的内容并打印
def print_all(f):
print(f.read())
#rewind函数传递了f变量,然后转到文件的0字节位置
def rewind(f):
f.seek(0)
#print_a_line函数传递了变量line_count和f,逐行读取变量并打印
def print_a_line(line_count,f):
print(line_count,f.readline())
#为变量current_file赋值,打开文档
current_file = open('input_file.txt')
print("First let's print the whole file:\n")
#为函数print_all传递了current_file值
print_all(current_file)
print("Now let's rewind, kind of like a tape.")
#为函数rewind传递了current_file值
rewind(current_file)
print("Let's print three lines:")
#为变量current_line传递了数值1,为函数print_a_line传递了变量值:current_line;current_file
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)
current_line = current_line + 1
print_a_line(current_line,current_file)
结果输出:
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 lines:
1 This is line 1
2 This is line 2
3 This is line 3
进程已结束,退出代码0
巩固练习
1. 每次print_all运行时,你都传递了一个current_line的变量。
每次调用函数时,打印出current_line的值,跟踪它在print_a_line是怎么变成line_count的。
2. seek函数
- 使用 open() 函数打开文件并读取文件中的内容时,总是会从文件的第一个字符(字节)开始读起。那么,有没有办法可以自定指定读取的起始位置呢?答案是肯定,这就需要移动文件指针的位置。
- 文件指针用于标明文件读写的起始位置。假如把文件看成一个水流,文件中每个数据(以 b 模式打开,每个数据就是一个字节;以普通模式打开,每个数据就是一个字符)就相当于一个水滴,而文件指针就标明了文件将要从文件的哪个位置开始读起。图 1 简单示意了文件指针的概念。
- 通过移动文件指针的位置,再借助 read() 和 write() 函数,就可以轻松实现,读取文件中指定位置的数据(或者向文件中的指定位置写入数据)。
- 注意:当向文件中写入数据时,如果不是文件的尾部,写入位置的原有数据不会自行向后移动,新写入的数据会将文件中处于该位置的数据直接覆盖掉。
- 实现对文件指针的移动,文件对象提供了 tell() 函数和 seek() 函数。tell() 函数用于判断文件指针当前所处的位置,而 seek() 函数用于移动文件指针到文件的指定位置。
Tips
1. print_all和其他函数里的f是什么?
变量。
2. 为什么seek(0)没有把current_line设为0?
首先seek()函数处理的对象是字节而非行,所以seek(0)只是传到文件的0个字节的位置(第一个字节)。其次,current_line只是一个独立变量,和文件本身没任何关系,只能手动为seek函数增值。
3. readline()是怎么知道每一行在哪里的?
readline()里边的代码会扫描文件的每一个字节,直到找到\n为止,然后它停止读取文件,并且返回此前发现的文件内容,文件f会记录每次调用readline()后的读取位置,这样它就可以在下次调用时读取接下来的一行了。
4. 为什么文件里会有间隔空行?
readline()函数返回的内容包含文件本来就有的\n,而print在打印时又会添加一个\n,这样一来就会多出一个空行了。解决方法是在print函数中多加一个参数end=“”,这样print就不会为每一行多打印\n出来了。