每日一python(13):文件指针

首先来看一个问题:假设有一个txt文件(filetest.txt),其中的内容如下:
在这里插入图片描述
现在,我们写一段读的程序,

# coding=utf-8
import os
# os.getcwd()获取当前路径,即项目工程的目录
f = open('filetest.txt','r')
print("第一次读到的内容:\n", f.read())
print("第二次读到的内容:\n", f.read())

读取的结果如下:
在这里插入图片描述
我们发现,第二次没有读出来任何内容,这是为什么呢?
从程序本身来看,前后两次调用f.read()函数,本意是将文件内容读两遍,可是第二次未读到任何内容。

针对这样的问题,其实是文件有一个文件指针(也叫 文件游标)的概念。实际上,当我们打开(open)这个文件的时候,此时,文件指针就定位在了文件的开头,当第一次调用f.read()函数时,相当于从文件指针的当前位置(即:文件开头)将这个文件全部读取出来;当第二次调用 f.read()的时候,实际上此时文件指针已经定位在了文件的末尾,再次读取的时候,指向的内容就为空了。

下面再看一个例子:

# coding=utf-8
import os
# os.getcwd()获取当前路径,即项目工程的目录
f = open('filetest.txt','r')
print("第一次读到的内容:\n", f.read(2))  # 读取 2 个字节的内容
print("第二次读到的内容:\n", f.read(4))  # 读取 4 个字节的内容

读取的结果如下:
在这里插入图片描述
我们看到第二次读取到的内容并不是 【 今年是佩】,而是【是佩奇年】 ,那也就是说,当我们第一次f.read(2)的时候,当前文件指针已经定位到了第2个字节的位置,当第二次执行f.read(4)的时候,实际上是从当前文件指针位置开始读取4个字节的内容。

下面接着看另一个例子:

# coding=utf-8
import os
# os.getcwd()获取当前路径,即项目工程的目录
f = open('filetest.txt','r')
print("第一次读到的内容:", f.readline())
print("第二次读到的内容:", f.readline())

经过之前的解释,相信大家也能知道这段程序读取的结果,应该是读取文件的前两行内容,实际结果也是如此:
在这里插入图片描述
现在我们改变一下需求,要求两次读取的内容都是 文件的第一行 内容,该怎么办?
此时,我们应该要做的是改变文件指针的位置。

如何改变文件指针呢?这里需要用到seek()函数,其语法:seek(offset, wherece)

  • offset:偏移量,即表示文件指针所在的当前位置要偏移的字节数
  • wherece: 0 - 从文件开头;1 - 文件的当前位置; 2 - 文件的末尾

有了这个seek() 函数,我们就可以实现上面的需求了,如下:

# coding=utf-8
import os
# os.getcwd()获取当前路径,即项目工程的目录
f = open('filetest.txt','r')
print("第一次读到的内容:", f.readline())
f.seek(0,0)  # 重置文件指针到文件开头的第0个位置
print("第二次读到的内容:", f.readline())

结果如下:
在这里插入图片描述

那么,能不能查看当前文件指针的位置呢?答案是肯定的,就是 tell()函数。
例如:

# coding=utf-8
import os
# os.getcwd()获取当前路径,即项目工程的目录
f = open('filetest.txt','r')
print("当前文件指针的位置:", f.tell())
print("第一次读到的内容:", f.readline())
print("当前文件指针的位置:", f.tell())
print("第二次读到的内容:", f.read(6))
print("当前文件指针的位置:", f.tell())

结果如下:
在这里插入图片描述

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值