1.文件读取指针函数seek()用法详解
seek()方法的语法如下:fileObject.seek(offset, from)
offset : 开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
from:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。
实例1
下面将用实例演示一下seek()方法的用法
下面是‘test.txt’文件内容:
1 | 0123456789 |
代码:
1 | file = open('test.txt', 'r') #只读方式,文件读取指针指向开头 |
结果:
1 | 0 |
上述结果之间空一行是因为读取了末尾的换行符
实例2
下面我再说一个例子,关于文件打开模式为‘a+’情况下的例子
文件跟上一个例子一样,先看代码:
1 | file = open('test.txt', 'a+') #可读写方式,文件读取指针指向末尾,数据追加在末尾 |
结果:
1 | 36 |
没有读取到数据是因为文件读取指针指向了末尾,所以在使用‘a+’模式时,如果要读取数据要利用seek(0,0)设置文件读取指针
‘test.txt’的变化:
1 | 0123456789 |
上述这个例子是我学习Python文件操作时遇到的坑,在利用‘a+’模式打开文件并写入数据后,用readline()怎么都无法读取数据,后来了解到是因为文件读取指针在末尾,所以无法读取数据,要用seek(0,0)方法将文件读取指针重置,才可以读取数据。
2.小练习
2.1 题目简化:
将浮点数num保留整数部分输出。
1 | # solution 1 |
2.2 python的连续不等式写法:
1 <= n <= 2
这种写法在python中是合理的,在其他大多数语言可能不成立。
2.3 小例题1
让用户输入一个数字,判断它是否等于553,如果不等于则让用户再次输入,否则退出程序。
1 | n = eval(input()) |
2.4 小例题2
1 | # solution 1 |
2.5 小例题3
判断用户输入的一个数是不是回文数。
1 | # solution 1 |
3.pass语句
Python pass 是空语句,是为了保持程序结构的完整性。
pass 不做任何事情,一般用做占位语句。
在 Python 中有时候会看到一个 def 函数:
1 | def sample(n_samples): |
该处的 pass 便是占据一个位置,因为如果定义一个空函数程序会报错,当你没有想好函数的内容是可以用 pass 填充,使程序可以正常运行。(python3中好像可以定义空函数)
4.for循环补充小知识
在for-in循环中,不能对虚拟变量i
进行修改,但是可以对可迭代对象s
进行修改。
1 | s = "abcdefghijklmn" |
5.错题1
以下说法中错误的是()
A、对已经关闭的文件进行读写操作会默认再次打开文件
B、对文件操作完成后即使不关闭文件也不会报错,所以可以不关闭文件
C、对于非空文本文件,read()返回字符串,readlines()返回列表
D、file = open(filename,’rb’)表示只读、二进制方式打开名为filename的文件
答案选A. B选项是正确的。
6.错题2
1、编写代码将列表ls = [‘新年都未有芳华,\n’,’ 二月初惊见草芽。\n’,’白雪却嫌春色晚,\n’,’故穿庭树作飞花。’]、
写入a.txt文件内容如下:
新年都未有芳华,
二月初惊见草芽。
白雪却嫌春色晚,
故穿庭树作飞花。
2、读取a.txt中的内容,并输出。输出格式如下(输出为一行):
新年都未有芳华,二月初惊见草芽。白雪却嫌春色晚, 故穿庭树作飞花。
1 | # solution for 1 |
7.练习1
二千多年前希腊的天文学家希巴克斯命名十二星座,它们是水瓶座、双鱼座、白羊座、金牛座、
双子座、巨蟹座、狮子座、处女座、天秤座、天蝎座、射手座、摩羯座。给出一个CSV文件(SunSign.csv),
内容示例如下:
序号,星座,开始月日,结束月日,Unicode
1,水瓶座,120,218,9810
2,双色座,219,320,9811
3,白羊座,321,419,9800
4,金牛座,420,520,9801
5,双子座,521,621,9802
…(略)
以第1行为例,120表示1月20日,218表示2月18日,9810是Unicode码。
问题:读入CSV文件中数据,获得用户输入。根据用户输入的星座名称,输出此星座的出生日期范围。
参考输入和输出示例格式如下:
请输入星座中文名称(例如,双子座):双子座
双子座的生日位于521-621之间
1 | # solution 1 |
8.错题3
当fo.write()
完成后,指针指向文件末尾,此时fo.read()
无法读取到内容。
9.练习2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17f = open("vacations.csv","r")
ls = f.readlines()
s = input("请输入节假日名称(例如,春节):")
for line in ls:
lt = line.strip("\n").split(",")
if s == lt[1]:
print("{}的假期位于{}-{}之间".format(lt[1],lt[2],lt[3]))
f.close()
# 简化版本
f = open("vacations.csv","r")
s = input("请输入节假日名称(例如,春节):")
for line in f:# 直接遍历文件,也是一行一行读取
lt = line.strip("\n").split(",")
if s == lt[1]:
print("{}的假期位于{}-{}之间".format(lt[1],lt[2],lt[3]))
f.close()
10.练习3
使用字典和列表型变量完成某课程的考勤记录统计,某班有 74 名同学,名单由考生目录下文件 name.txt 给出,
某课程第一次考勤数据由考生目录下文件 card.csv 给出。请求出第一次缺勤同学的名单。
1 | # solution 1,自己写的,比较复杂 |