首先来看一个问题:假设有一个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)
有了这个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())