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

首先来看一个问题:假设有一个txt文件(filetest.txt),其中的内容如下:
每日一python(13):文件指针_第1张图片
现在,我们写一段读的程序,

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

读取的结果如下:
每日一python(13):文件指针_第2张图片
我们发现,第二次没有读出来任何内容,这是为什么呢?
从程序本身来看,前后两次调用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 个字节的内容

读取的结果如下:
每日一python(13):文件指针_第3张图片
我们看到第二次读取到的内容并不是 【 今年是佩】,而是【是佩奇年】 ,那也就是说,当我们第一次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())

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

如何改变文件指针呢?这里需要用到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())

结果如下:
每日一python(13):文件指针_第5张图片

你可能感兴趣的:(每日一Python,Python基础)