00:00
好,接下来我们再来说啊,再来说一个内容,就是我们这个读取文件的一个位置,点一个PY,嗯,那这样我们演示呢,还是先来创建一个代码,我们这样把这个DEMO这我改一下啊,demo.t改成ABCDGHIJK,哎,或者这样吧,我直接还是写我们这个lom,还是写这个啊,还是写这一系列,那现在呢,我们已经有这文件了,那我们先来干嘛呢?诶,我们之前都是用文本文件的形式去读它的,我现在改一种形式,我以二进制形式形式去读它啊,直接来一个这个file name啊file name等于一个这样吧,我就简写了啊,我就不麻烦这么写了,直接来一个这个with位字,我们这儿来一个这个open open打开谁呢?打开的是我们这个demo.tit然后呢,这块我们用二进制形式去读,直接来RB,那注意二进制形式读,你就不要再只用Co了,因为二进制就直接读了,你只用including就该。
01:00
呃,也也没用对吧?哎,他会给你报错的,直接我这来一个S,我们这直接来一个file OB接,那现在我这直接来一个file OB接点一个RA,哎,我直接打印啊print,我们直接来一个file OB接点一个这个read啊,直接保存啊,我们来看一下效果,直接一执行,那这个时候你会发现这种形式跟我们之前用那种文本形式去读没什么区别啊,其实区别还挺大的,为什么挺大呢?前面多了一个B,这表什么意思?这表示现在这个字符串是一个二进制的字符串,比如说虽然它显示出来了内容了,但是它本质上是一个字符串,只不过我们Python给你显示出来了,不信你可以在这加一个索引,我直接加一个中串零,我们这一执行走一个是不是76啊,诶76这个时候它反而就是那个编码了,而不是说我们那个什么呀,真正那个内容了,所以这种B表的是二进制这种字符串,但是它会以这种正常字符串形式给你显示出来,如果你这里边有中文,你看就比较明显了,比如说我这写一个中啊一保存我们这一执行。
02:00
哎,不是执行它啊,应该是执行我们的这个东西一执行,呃,把索引给它去掉一执行。这时候你就看到了,这是我们中的那个编码啊,这是我们中文编码,这时候你就看出来了,它实际上显示的是还是二进制,只不过这些东西都是我们那个ask two的,它可以直接显示,而像我们这个中它是UT,它是不是这个ask two,所以显示不出来了啊,显示不出来了这么一个意思啊好,那现在呢,我把这个中文先去掉,那接下来我们来说一个什么问题呢?哎,我们都知道我们通过readid可以指定我们要读取几个,比如说来一个100,这一执行是不是就读100个字符啊,哎,100个字符,但是这儿我读的是二进制的啊,所以在这儿100实际上是100个字节啊,实际上100个字节,但是像我们这种英文,它实际上就是一个字符,就是一个字节,所以在这儿没有区别,但是中文刚才我们看到了,其实是三个字节代表了一个中文字符,所以那个时候就要注意,但是在这儿是没什么问题的,中文情况待会儿我们再去跟他说一下啊好,那现在我们这已经读出来了100了,对吧,那有一些情有一些情况我想干嘛呢?诶我想知道我现在读到第几个了,读到第几个了,那怎么。
03:10
怎么办?哎,那在这我们有一个函数叫做一个TT什么意思呀?哎,T我们叫做告诉啊til这个方法用来干嘛呢?哎,用来查看我们当前读取的一个位置啊,当前读取的位置,那我们这块如果要看的话,直接来一个当前读取到了直接啊我们画一个箭头,这打印一下谁呢?我们直接file OB接点一个TAIL1保存,我们这一执行,咱们来看是不是当前读取到了100啊,哎,当前读取到了100啊,然后在这儿啊,我先我再来一个,我这儿来一什么呢?来一个30啊30我这一执行是不是当前读取到一百三呀?哎就说通过它就可以告诉你当前读取到哪个位置,那这哪个位置什么意思?诶,你可以想象着是吧,我们是实际上是在读这文件,读文件就像我们读书一样,我们读书怎么读啊,有的情况下我们是不是一个手指头,一个手指指着读啊,哎,可能会这么读,哎,Lom对吧,我是这么一个一个读的啊,一个一个读的,那这个。
04:10
他要告诉什么意思?哎,告诉我你这手指头是指到哪了,比如说这是100咔告诉你现在指在这儿了啊咔,这儿是一百三告诉你指在这儿了,比如说告诉你现在读到哪了,你再读是不是就该从这个位置往后了,所以在这儿他改给我们来一个T,是一个130,再往下读,是不是从一百三十一开始往后去读了,哎,往后去读了啊,所以注意T用来告诉我们当前读取到的一个什么呀,哎,读取到的一个位置啊,读到一个位置,那好我们有读取到的位置了,那我们现在就说了,我能不能修改这个位置,哎修改位置,那在这我们有一个方法叫做一个什么呢?叫做一个这个seek。诶叫做一个sick sick是干嘛的呢?诶sick,哎它可以干嘛呢?哎,它可以用来修改我们当前读取的一个位置,哎,读取的一个位置,那现在啊,我先把这两个住了,这两个住了以后,我现在是不是等于一个都没读啊,哎,一个都没读住了,现在啊,我们先不掉S啊,先注掉这一保存,我们这一执行现在是零,还没读呢,对吧,还没读呢,那现在注意啊,我这S里边我来一个这个55啊55,那这个55表示什么意思,就表示现在我把我手指头放在第55个字符,也就说前面55个我都已经读过了,再读的时候,我是从55往后来读的,这时候我们来看效果,我这已执行,现在告诉我什么,当前读取到了55啊,当前读取到了55,那这个时候注意,当我调完这个S以后,我再去读啊,比如说我five object点一个read read,我读五个,这回还是不是从头读了,不是了,就从第55个开始读了,我们这一执行发现什么呀,T逗号SE。
05:49
对,T逗号SE跟哪呢?TTTT逗号SE是不是应该是在这儿呢?也就说前边这是都是55个从这儿开始读的啊,从这开始读的,也就是说我通过这个seek改变了我们这个指针的位置啊,开始它是从指向的零的第一个嘛,索引为零对吧,当我设置为55后,它是不是直接指到这儿了,诶直接指到这儿从诶不是这就是这是吧,指到这儿了,也就说前边这55全都读过了,从这儿往后开始读啊,从这往后开始读,所以这个叫做一个诶S啊,它可以来改变我们当前的一个位置,我也可以连续改变,我这再改变一什么呢?改变一八十啊改变一八十,那这个时候注意我们先不读啊,我们直接看它的位置,这一执行现在是不是读到80了,哎,可以通过它来改变我们这个读取的一个位置啊,非常简单,那这里边注意我们来说一下啊,我们这个seek需要两个参数,诶需要两个参数,但是你看我这是不是只传了一个呀,哎,很明显会有一个默认参数,第一个是什么呢?哎,是我们这个要。
06:49
切换到的位置,也就是说你要切换到哪个位置啊,哪个位置,第二个是什么呢?诶第二个是我们的这个计算位置的一个方式啊,计算位置的一个方式,那我们这里面注意它有三个可选值啊,可选值这里边就不是我们瞎写的了,它有三个可选值,哪三个可选值呢?诶第一个值是零,第二个值是一,第三个值是二,零表什么意思?零表是从头计算啊从头计算,所以如果我这,诶咱们这块注意零是默认值,你不写它就先要写一个零,所以我这80我写一个零,一保存走一个,诶是不是还是80啊,哎,还是80啊写倍都一样,零表示从头计算什么意思,你这块写一个零,那这个其实零你就不用看了,你这写80,这个指针就放到80的位置,你写99,就放在99的位置,你写多少它就是多少啊,这是从头计算,那这个时候它就会有一个问题,那假如说我这写了一个这个七十七十啊,我这一保。
07:49
诶走,你是不是到70了,诶但是有一些情况下,我想什么呢?我想从当前位置往后数70个,那对于80来说,我应该到一百五对吧,但如果我现在是40,我就应该到什么呀,到一百一对吧,也就说我想从当前位置计算,那这个时候你这可以写什么,可以写一啊,可以写一,这时候一保存一执行,是不是读取到一百五了,哎,一百五了,也就是说这个时候它进行了什么呀,进行了累加啊累加所以一表示什么意思呢?一表示从我们这个当前位置计算啊,从当前位置,你当年在哪,我从呢这个位置开始往后加啊,这是一表示从当前位置开始计算,还有一个值是我们这个二,二表示什么意思呢?二表示从我们那个什么呀?哎,从最后位置开始计算啊,开始计算,那现在我们来看啊,我这一保存,我这一复制,我这写一个什么呢?写个零,写个零,我这改小点改一,诶不是零啊,应该是写一个二,从最后位置开始算,那什么意思?从最后位置开始,往后走一个啊,往后走一个,那现。
08:49
在我们来看啊,我们这一直行走一个是不是到452,哎452,那好了,我问你452,现在我能不能读出东西来,能不能读出东西来,诶我这一执行干嘛了,什么也没有啊,什么也没有,为什么什么也没有,我们来看我们这个文件,我这文件我全选中,咱们来看看,诶那这块儿它给我显示的一共是446,实际上那些换行它没包括进去啊,没包括进去,那如果包括换行,我们来看看446 447 448 449 450 451 452,如果包括那些换行,这些东西是不是应该正好应该是451,最后一个没有对吧,应该,所以我这个文本的长度应该一共是451啊,长度一共是451,那现在我们这掉了一个sick以后,我们来看一下,掉了sick以后,刚才我们看到那位置是不是变成452了,那我问你了,452有没有内容,哎,没有内容,没有内容,所以你这就干嘛了,读不出来了啊,读不出来了,所以注意这是表示从后计算。
09:49
你说读不出来有什么用啊,哎,注意我这可以传一个什么呀,负一,那负一表示什么意思,从后计算减一个,那这个时候就读的是什么呀,最后一个是不是读到最后那点啊,你来一个什么呀,你来一个负十,就是读最后十个啊,最后十个是这么一个效果啊,所以注意这三个东西啊,0120是从头计算一表,从当前位置二表什么呀,从最后的位置开始计算啊,开始计算,那这东西有什么用?诶其实作用还挺明显的,有有些情况下,我们可能只想读取文件的一部分,并不想读取文件全部,我能去读中间,或者读前边一半,读后边一半,那这个时候我就可以用什么呀,Seek来调整我们那个指针的位置,其实你就想象什么呀,在我们这里边有一个光标,我们这seek是干嘛呀,就是在调整这光标位置,从哪开始读的啊,就是从哪开始读的这么一个意思啊,这是我们这个seek,还有这个这个ta啊,这两个一个是读取位置,一个是报告位置啊两个方法,那这里边注意这个东西呢,咱们现在我演示的时候是对这个二进制。
10:49
文家来演示了,那我们说了对我们这个文本文件行不行啊,哎,我这复制一下文本文件也可以啊,文本文文件也可以,但是呢,它会比较特殊一点,咱们这啊,我改成RT啊,现在是我们这个读取我们这个文本文件了,对吧?以文本件形式形式去读,我们看效果一执行效果是不是一样的呀?哎,读取到451我们这里边等于是你看是不是从T这开始读的,哎,用这个文本文件也可以,那这样啊,我读十个,我读十个从55开始,是不是效果是一样的,诶效果是一样的,但是这有什么问题啊,有什么问题我们来看谁呢?DEMODEMO2是有中文的对吧?DEMO我们这来读我们这个DEMO2,那这样啊,我seek我来一个三,我先来一个三啊来一个三,我们来读十个来看,呃,读十个这样吧,我全读出来,Seek从三开始,我们这一执行你会发,哦对,因为我们这没有指定编码。
11:49
因为我们这是有中文的对吧,所以在这儿我需要整一个UTF杠八啊,这一保存再执行。Require type s ts。
12:01
Require。这是我们看看第几行吧,在我们第23行还是这儿报的错,对吧,这报的错,他告诉我们他需要的是一个按integer is required。那就证明第三个参数它不是这个,我们来看一下吧,我们之前那个啊,第三个参数是它是吧,所以我现要指定编码,我还得用我们这个关键字的这个参数,所以在这儿呢,还是得把这个encoding给它写上,Encoding等于UT8啊这样我们再一执行,诶那这个时候你会发现它是不是正好把这个除给跳过去了,哎除给跳过去了,那注意为什么?因为我们这个seek这这指定是字节啊字节,而我们中文是三个字节,一个什么呀,一个字符的,所以我这跳过三,正好把除跳过去了,那如果我写一个六呢,哎,六就干嘛了,就把和也跳过去了,哎如果我写一个九就把谁呢?哎,就把我们这个哎日也跳过去了,对吧?哎除了日让五都给跳过去了,但是我这如果写个十呢,那我们说了三个字节是一个一个字,我这十是有三个三个字节,还有一个什么呀,一个字节的,那等于是不是1/3的字啊,那这个时候你再一节干嘛了,是就。
13:21
是不就报错了,那就报错了,为什么?因为我把一个字给它分成了两半,一半是是1/3,一半2/3,那这个时候那2/3他就不认识了啊,他就不认识了,所以这时候就出现问题了啊,出现问题了,所以我们这个seek也可以用来对付我们这个文本文件,但是你对文本文文本文件的时候,一定注意你这个文本,你这个字符到底占几个字节,如果是R字two的abcd,那就是一个字节没问题,但是如果是UTF杠八的,我们一个中文占三个字节,那这个时候你就要好好看看了,到底你这个字节数跟这个对不对着,那这个时候就需要做一些这种什么呀判断了啊,这一点需要注意一下啊,注意一下好,这个时候我们说这个seek,还有这个til啊,我们来停一下。
我来说两句