Exercise 20: 函数和文件

原文链接: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

研究训练:

1、通过给每一行代码写一个注释来理解脚本做了什么操作。
2、每次运行print_a_line 函数的时候你都传递了一个current_line变量给它。写出在它的每一个函数调用中current_line等于什么值,并且追寻这个值是怎么成为了print_a_line中line_count的值。
3、查找每一处函数调用的地方,检查用def定义了函数的地方来确保你传递给这个函数的参数都在正确的。
4、在网上搜索files文件操作中seek函数是起什么作用。可以用 pydoc file命令来查看其用法看看你在这里是否能把它弄明白。
5、查找简写 += 的用法,然后用它来重写脚本。

学生遇见的常见问题:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值