《笨方法学 Python 3》20.函数和文件

基础练习:

这节课的主要内容,就是调用函数来操作文件,函数和文件的结合使用;

理解起来可能有点麻烦,看不懂就自己写一遍!

#导入argv模块
from sys import argv

#解包
script, input_file = argv

#定义一个函数:读取并打印传参文件
def print_all(f):
	print(f.read())

#定义一个函数:跳转到传参文件的0字节,也就是第1个字节
def rewind(f):
	f.seek(0)

#定义一个函数:打印传参的行数及该行的内容
def print_a_line(line_count, f):
	print(line_count, f.readline())

#打开文件对象,并把文件对象赋值给变量
current_file = open(input_file)

print("首先让我们打印整个文件:\n")

#调用函数:读取并打印
print_all(current_file)

print("现在让我们倒带,有点像磁带。")

#调用函数:跳转到文件的首字节
rewind(current_file)

print("让我们打印三行:")

#给1取个变量名
current_line = 1

#调用函数:打印行数,和文件的一行内容;第一个传参是变量current_line,第二个传参是变量current_file)
print_a_line(current_line, current_file)

#同34#和37#
current_line = current_line + 1
print_a_line(current_line, current_file)

#同34#和37#
current_line = current_line + 1
print_a_line(current_line, current_file)

结果:


 有几个小问题:

1. seek(0)为什么不把current_line设置成0?

因为seek(0)是跳转到文件的0字节,也就是第1个字节,也就是说在首行,所以current_line设置成1;

2.readline是怎么知道每一行在哪里的?

readline()会扫描文件的每一个字节,直到找到第一个\n(也就是换行符)时为止,然后它会返回此次发现的所有内容,包括\n本身;文件也会记录每次readline()读取的位置,下次readline()再读取时就会从之前记录的位置开始读取,而不是从头开始;

3.为什么结果里会有间隔符(空行)?

因为readline()返回的结果本身就带有\n,而print()在打印时又会添加一个\n,所以就会多出一行;解决办法就是在print()函数的末尾多加一个参数end = "",这样print()就不会自己添加\n了;


折腾一下:

+=是什么?  +=是一个简写,x += y的意思就是x = x + y;

然后我们用这个简写用在习题的代码中:

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("首先让我们打印整个文件:\n")
 
print_all(current_file)
 
print("现在让我们倒带,有点像磁带。")
 
rewind(current_file)
 
print("让我们打印三行:")
 
current_line = 1
 
print_a_line(current_line, current_file)
 
current_line += 1
print_a_line(current_line, current_file)
 
current_line += 1
print_a_line(current_line, current_file)

 注意第30和33行代码,使用的+=简写,和之前不一样了,但是结果是一样的!!!

猜你喜欢

转载自blog.csdn.net/waitan2018/article/details/82534388