7.8 文件内光标的移动 检测/截断文件内容 修改文件的两种方式

当文件内容中间需要增加内容时,单纯的使用w和a模式已无法实现,所以我们需要对文件内的光标进行移动

>>>硬盘上从来没有修改一说,硬盘上只有覆盖,即新内容覆盖新内容。<<<

光标移动常用方法

seek(offset,whence)

  • offset 代表文件指针的偏移量,单位是字节,

  • whence 代表光标的位置,

      0:参照文件的开头 t和b都可以使用
      1:参照光标所在的当前位置 只能在b模式下用
      2:参照文件的末尾 只能在b模式下使用

# test02.txt
# >>>>>>
#tian是天上的云
#tian是天上的云
#tian是天上的云
# >>>>>>
with open(r'test02.txt','r',encoding='utf-8') as f:
    print(f.read(5))

#tian是 
# 在rt模式下 read内的数字 表示的是字符的个数
# 除此之外,数字表示的都是字节
只有在r模式下才可以进行游标操作(游标操作的是字节)

with open('a.txt','rb') as rb:

  date = rb.read(10)

  f.seek(2,0)   #seek(offset,whence)    offset   前面的是游标移动的字节数,正数表示向后移动,负号表示向前移动。  

        逗号后面的数字在b模式下可以为0、1、2

        whence    0:游标置到开头  1:游标置到当前位指  2:游标置到末尾

# 你是日本人
with open('target.txt', 'rb') as f:
# 先读6个字节
data = f.read(6)
print(data.decode('utf-8')) # 你是
# 将游标从头开始往后偏移3个字节
f.seek(3, 0)
data = f.read(6)
print(data.decode('utf-8')) # 是日
# 从当前游标位置往前偏移3个字节
f.seek(-3, 1)
data = f.read(3)
print(data.decode('utf-8')) #

f.seek(-3, 2)
data = f.read(3)
print(data.decode('utf-8')) #

 检测文件内容

  检测文件是否被修改
  打开文件 利用f.seek(0,2)将光标移动到文件末尾
  利用while循环
  再利用readline()来读取末尾内容
  在通过if判断看readline()是否有值,有值说明文件新增了内容
  通过字符串的格式化输出将新增的文件内容输出给检测程序
  查看当前光标移动了多少字节

with open(r'a.txt','rb') as f:
    # 先将光标移动到文件末尾
    f.seek(0,2)
    while True:
        res = f.readline()
        # 查看光标移动了多少位 bytes
        # print(f.tell())
        if res:
            print("新增的文件内容:%s"%res.decode('utf-8'))
            # 说明有人操作当前文件
        # else:
        #     # 说明文件没有被任何人操作
        #     print('暂无其他人操作该文件')

截断文件内容 

  截断文件内容
  f.truncate() 括号内输入的数字 表示的是字节数
  将内存中的文件内容直接刷到硬盘
  f.flush()

with open(r'a.txt','a',encoding = 'utf-8') as f:
    f.truncate(3)  # 接收字节的长度,必须为整型
    #保留0~3的字节数,后面的全部删除

修改文件的两种方式

# 第一种方式:

# 先将数据由硬盘读到内存(读文件)
# 在内存中完成修改(字符串的替换)
# 再覆盖原来的内容(写文件)

复制代码
with open(r'a.txt','r',encoding='utf-8') as f:
    data = f.read()
    print(data)  # 读取该文件

with open(r'a.txt','w',encoding='utf-8') as f:
    res = data.replace('egon','jason')  # 将该文件里指定的内容进行替换
    f.write(res)  # 将修改的内容写入
复制代码
 

优点:任意时间硬盘上只有一个文件 不会占用过多硬盘空间
缺点:当文件过大的情况下,可能会造成内存溢出
# 第二种方式:

# 创建一个新文件
# 循环读取老文件内容到内存进行修改 将修改好的内容写到新文件中
# 将老文件删除 将新文件的名字改成老文件名

复制代码
import os  # 调用功能


with open(r'test02.txt','r',encoding='utf-8') as read_f,\
        open(r'test02.swap','a',encoding='utf-8') as write_f:
    for line in read_f:  # 取read_f 中的文件
        new_line = line.replace('jason','egon')
        write_f.write(new_line)
os.remove('testt02.txt')  # 移除该文件
os.rename('test02.swap','test02.txt')  # 重新命名
复制代码
 

优点:内存中始终只有一行内容 不占内存
缺点:再某一时刻硬盘上会同时存在两个文件

 

转载于:https://www.cnblogs.com/PowerTips/p/11154522.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值