笨方法学python 习题20

代码如下

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出来了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值