码迷,mamicode.com
首页 > 移动开发 > 详细

IO操作-主动控制文件内指针移动

时间:2020-12-25 12:29:08      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:详解   with   文件名   读取   odi   读写   表示   coding   读取内容   

一、文件内指针移动的规则

  1.文件内指针移动的都是要bytes字节为单位

  2.只有一种情况特殊:t模式(文本文件)下的read(n),是以字符为单位

  案例:t模式下的读取

    如有文本文件名为aaa.txt,其中内容为:aaa你好呀

    with open(r‘aaa.txt‘,mode=‘rt‘,encoding=‘utf-8‘) as f:

      res = f.read(4)  #d读取字符的个数

      print(res)  # 打印结果

    打印结果:aaa你  

  案例:b模式下的读取

    with open(r‘aaa.txt‘,mode=‘rb‘) as f:

      res = f.read(6)  # b模式下以字节为单位,一个应为为一个字节,一个汉字为3个字节

      print(res)

    打印结果:b‘aaa\xe4\xbd\xa0‘  # b表示以bytes为字节,\xe4\xbd\xa0表示三个字节(一个汉字三个字节)

二、主动控制文件内指针移动

  在之前学习中的文件指针移动都是以读写操作而被动触发的,如果想读取文件某一特定的位置,则需要用f.seek(指针移动的字节数,控制模式)

  语法:f.seek(n,控制模式)   # n表示移动的字节数,控制模式如下详解

    模式模式

      0模式:默认的模式,代表指针移动的字节数是以文件开头为参照物

      1模式:代表指针移动的字节数是以当前指针所在位置为参照物

      2模式:代表指针移动的字节数是以文件末尾为参照物,应该倒着移动

    注意:其中0模式可以再t或者b模式使用,但是1和2模式只能在b模式下使用

    1. 0模式详解案例:参照物为文件开头

      如有文本文件名为aaa.txt,其中内容为:aaa你好呀

      案例一:

        with open(r‘aaa.txt‘,mode=‘rb‘) as f:

          f.seek(3,0)  # 指针移动到3个bytes的位置,以0模式读(以文件的开头为参照物)

          print(f.tell())  #f.tell()表示获取文件指针当前的位置

        打印结果:3  # 表示文件指针当前的位置为3,即当前文件指针距离文件开头的位置为3

      案例二:

        with open(r‘aaa.txt‘,mode=‘rb‘) as f:

          f.seek(3,0)  # 指针移动到3个bytes的位置,以0模式读取

          res = f.read()  # 读取当前位置以后的内容,即从第3个字节后开始读取内容

          print(res.decode(‘utf-8‘))  #打印出res,并且解码(文件存的时候字符编码为utf-8,这里读取如果不解码就会以字节的方式打印出来)

        打印结果:你好呀

    2. 1模式详解案例:参照物为文件当前位置

      如有文本文件名为aaa.txt,其中内容为:aaa你好呀

      案例一:

        wiht open(r‘aaa.txt‘,mode=‘rb‘) as f:

          f.seek(3,1)  # 以当前文件指针读取3个字节(第一次读取当前文件指针在首尾)

          f.seek(6,1)  # 以当前文件指针读取5个字节(上面已经读取了3个字节,这是指针位置应该在3,在读取6个字节,指针应该在9)

            print(f.tell())  # 打印当前文件指针的位置

        打印结果:9  # 打印出当前文件指针位置在9的位置

      案例二:

        with open(r‘aaa.txt‘,mode=‘rb‘) as f:

          f.seek(3,1)

             f.seek(6,1)

          res = f.read()

          print(res.decode(‘utf-8‘))

        打印结果:呀  # 第一次指针当前为值为首尾,移动3个字节,第二次指针移动6个字节是在第一次的基础上在移动6个字节,所以为9个字节

                 一个英文为1个字节,中文为3个字节,所以第一次移动3个字节在aaa后面,在移动6个字节在“好”后面,在读取后面的字节

    3. 2模式详解案例:参照物为文件末尾,倒着移动

      如有文本文件名为aaa.txt,其中内容为:aaa你好呀

      案例一:

        with open(r‘aaa.txt‘,mode=‘rb‘) as f:

          f.seek(-3,2)  # 从文件末尾开始读取,向前读取3个字节,-3表示倒着移动3个字节

          print(f.tell())  # 打印文件当前指针的位置

        打印结果:9  # 从文件末尾向前移动3个字节,前面就还有9个字节,所以指针移动到9个字节的位置

      案例二:

        with open(r‘aaa.txt‘,mode=‘rb‘) as f:

          f.seek(-3,2)

          res = f.read()

          print(res.decode(‘utf-8‘))

        打印结果:呀  # 从文件末尾移动3个字节,到了第9个字节的位置,“aaa你好”刚好为9个字节,从第9个字节向后读取,所以打印出来为“呀”

IO操作-主动控制文件内指针移动

标签:详解   with   文件名   读取   odi   读写   表示   coding   读取内容   

原文地址:https://www.cnblogs.com/xialiang37/p/14166086.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!