Python基础24:文件的高级操作之控制文件指针的移动

# 1个字符一个字节,一个中文3个字节 。所以 我是adc 就是9个字节
# 指针移动的单位都是以字节/bytes为单位
# 只有一种情况特殊(非常重要):只有t模式下的read()函数是用的字符,t模式其他函数也是字节
#     t 模式下的read(n), n代表的是字符个数

# 实例:
# t 模式下:(已经在文件中写入(utf-8保存的):我是adc)
with open(r'E:\PycharmProjects\demo01\Egon202003\01python基础-24文件的高级操作之控制文件指针的移动的文件', mode='rt', encoding='utf8') as f:
    print(f.read(4))  # 这里因为是t模式,以字符为单位移动,所以是4个字符,即输出 我是ab
    # 我是ab
    print(f.read())
    # c

# f.tell() # 获取文件指针当前位置
# f.seek(n,模式):
#   n:指的是移动的字节个数
#     模式:
#         0:参照物是文件开头的位置 (在t 、 b模式下都可用)
#         1:参照物是文件当前指针所在的位置 (只能在b模式下用,t模式下会报错)
#         2:参照物是文件末尾的位置 (只能在b模式下用,t模式下会报错)
with open(r'E:\PycharmProjects\demo01\Egon202003\01python基础-24文件的高级操作之控制文件指针的移动的文件', mode='rb') as f:
    # print(f.read(4).decode('utf-8')) # 这里因为是b模式,以字节为单位移动,所以是4个字节,但是一个中文是3个字节,不能拆开,所以报错
    # UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe6 in position 3: unexpected end of data
    print(f.read(3).decode('utf-8'))  # 读取从文件开头开始的3个字节,此时文件指针停留在第3个字节
    # 我

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

    f.seek(6, 0)  # 此时文件指针停留在第6个字节
    print(f.tell())  # f.tell() # 获取文件指针当前位置
    # 6

    print(f.read(3).decode('utf-8'))  # 输出从文件指针当前位置开始连续的3个字节
    # abc

    f.seek(3, 0)  # 此时文件指针停留在第3个字节
    print(f.tell())  # f.tell() # 获取文件指针当前位置
    # 3
    print(f.read(3).decode('utf-8'))
    # 是
    print(f.tell())  # f.tell() # 获取文件指针当前位置
    # 6
    f.seek(2, 1)  # 此时文件指针停留在第8个字节(因为当时文件指针已经在第6个字节的位置了,又是1模式(参照当前位置移动2个字节))
    print(f.read(1).decode('utf-8'))
    # c
    print(f.tell())  # f.tell() # 获取文件指针当前位置
    # 9
    f.seek(-2, 2)  # 此时文件指针停留在第7个字节(因为当时文件指针已经在第9个字节的位置了,又是2模式(参照当前位置向前移动2个字节))
    print(f.read(3).decode('utf-8'))
    # bc
    print(f.tell())  # f.tell() # 获取文件指针当前位置
    # 9

import  time
# 监控文件内容是否有增加有就打印出来 (实现tail -f 功能)
with open(r'E:\PycharmProjects\demo01\Egon202003\01python基础-24文件的高级操作之控制文件指针的移动的文件',mode='rb') as f:
    # 首先得先将文件指针跳至文件末尾;有两种方法:
    # 1、直接f.read() # 但是这种是不可取的,因为文件过大,内存直接爆了
    # 2、采用f.seek(0,2) 注意有seek一般都用b模式,否则在t模式 1,2不能用
    f.seek(0,2) # 将文件指针移动至末尾
    f.tell()
    while True:
        res = f.readline()
        if len(res)==0:
            time.sleep(0.3)
        else:
            print(res.decode('utf-8'))

# 我在文件中追加了内容后打印出来了
# 1
#
# 2
#
# 3
#
# 4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值