二进制文件的读取位置
首先来创建一个文件,看一下读取文件的位置,依然使用demo.txt来展示。
#使用二进制文件的读取方式
with open('demo.txt','rb') as file_obj:
print(file_obj.read())
执行结果为:
文档前面的b
代表它是一个二进制的字符串,但是因为类型是ASCII,所以文档内容是以正常字符串的形式显示出来的。怎么验证呢,可以加一个位置索引,读取指定位置的字符,此时显示的就是一个数字了,如下:
with open('demo.txt','rb') as file_obj:
print(file_obj.read()[0])
执行结果为:
如果文档里面有中文字符的话,可以看的更加明显,自己可以尝试一下。
之前的课程中讲过,可以加入步长,读取的就是指定长度的内容,比如,这里读取前100个字符:
with open('demo.txt','rb') as file_obj:
print(file_obj.read(100))
执行结果为:
那么如果我们想知道读取到什么位置了呢,此时就可以通过tell()方法来实现,这也是本节课讲授的新知识。
tell()方法
tell() 方法用来查看当前读取的位置。
with open('demo.txt','rb') as file_obj:
print(file_obj.read(100))
print(file_obj.read(30))
print('当前读取到了 -->',file_obj.tell())
执行结果为:
seek()方法
seek() 可以修改当前读取的位置。
with open('demo.txt','rb') as file_obj:
file_obj.seek(55)
print('当前读取到了 -->',file_obj.tell())
执行结果为:
seek的用法:
seek()需要两个参数,第一个 是要切换到的位置,第二个 计算位置方式,它的可选值为:
1、0 从头计算,默认值
2、1 从当前位置计算
3、2 从最后位置开始计算
即先看第二个数字,假设是(x,0)则表示从文档的开始位置切换到第x个位置,如果是(x,1)则表示切换到从当前读取到的位置再向后x的位置开始,同理,如果是(x,2)则表示,切换到文档的末尾再向后x的位置开始,注意,x可以是负数。
with open('demo.txt','rb') as file_obj:
file_obj.seek(55)
# file_obj.seek(80,0)
# file_obj.seek(70,1)
# file_obj.seek(-10,2)
print(file_obj.read(5))
print('当前读取到了 -->',file_obj.tell())
执行结果为:
可以将上述注释掉的代码自己进行尝试,深入的理解seek和tell的用法。
在文本文件中的用法
上面讲述了在二进制文档中的用法,下面说一下在文本文档中的用法,大体上是差不多的,但是稍微有一点区别。
首先将上述代码复制,并修改mode的值为rt,看一下在文本文件的效果:
with open('demo.txt','rt' ) as file_obj:
file_obj.seek(55)#切换到55
print(file_obj.read(10))#读取10个字符的内容并输出
print('当前读取到了 -->',file_obj.tell())
执行结果为:
看起来是没有问题的,但是我们再来读取一下其他格式的文档。比如demo2,注意修改编码格式;
文档内容:
代码如下:
with open('demo2.txt','rt' , encoding='utf-8') as file_obj:
#从第三个字节开始,一个中文是3个字节
file_obj.seek(3)
print(file_obj.read())#读取全文
print('当前读取到了 -->',file_obj.tell())
执行结果为:
此时就将第一个汉字跳过了,但是在这里注意一下,一个中文是3个字节,如果seek里面的第一个参数不是3的倍数,那么将会报错!
所以seek和tell也是可以用于除了ASCII之外的文档的,但是要注意参数的位置。
点击查看配套视频教程
查看更多有关Python的内容,请订阅Python学习站官方技术圈!