前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python-文件操作(二)

python-文件操作(二)

作者头像
HammerZe
发布2022-03-24 14:31:26
3170
发布2022-03-24 14:31:26
举报
文章被收录于专栏:Hammer随笔

目录

文件操作

文本模式和二进制模式下read()方法的使用

英文字符统一使用一个bytes来表示,中文字符统一使用三个bytes来表示

文本模式

  • 格式:read( n ),n为数字
  • 文本模式下n表示字符个数

实例如下:

代码语言:javascript
复制
# 在a.txt文件中写入‘python编程’
with open(r'a.txt', 'rt', encoding='utf8') as f:
    # 查看python
    print(f.read(6))
    
# 结果
python

with open(r'a.txt', 'rt', encoding='utf8') as f:
    # 查看‘python编程’,多加两个中文字符,bytes加6
    print(f.read(12))
    
# 结果
python编程

'''
易错点:在使用read连续在同一个with下操作,读取完文件内容再读取,
       光标在文件末尾,读取的内容为空。
'''
# 进行下面操作查看易错点
with open(r'a.txt', 'rt', encoding='utf8') as f:
    # 查看‘python编程’,多加两个中文字符,bytes加6
    print(f.read(3))
    print(f.read(3))
    print(f.read(3))
    print(f.read(3))
# 结果
pyt
hon
编程

二进制模式

  • 格式:read( n ),n为数字
  • 二进制模式下n表示字节个数

实例如下:

代码语言:javascript
复制
# 在a.txt文件中写入‘python编程’
with open(r'a.txt', 'rb') as f:
    # 查看python,读六个字节
    print(f.read(6))
    # 再往下读三个字节,输出‘编’
    print(f.read(3))
    # 再往下读三个字节,解码输出‘程’
    print(f.read(3).decode())

with open(r'a.txt', 'rb') as f:
    # 查看python,读六个字节
    print(f.read(6))
    # 一个中文字符占三个字节,如果读取的字节数不够,解码输出文本会报错
    print(f.read(1).decode())
    # UnicodeDecodeError: 
    # 'utf-8' codec can't decode byte 0xe7 in position 0: unexpected end of data

文件内光标的移动

如果想移动光标到指定的位置,来读取或着追加内容需要用到的方法 f.seek( ) , tell( ) 方法查看光标移动了几个字节( b模式 )字符( t模式 )

  • seek( )方法格式:
    • f.seek(offset , whence )
    • offset : 光标的偏移量,以字节为单位移动,正数从左到右
    • whence : 表示三种模式,0,1,2
  • 三种模式详解: 0模式 : 默认的模式 , 支持文本( t )和二进制( b )两种模式 , 以文件开头为参考系 1模式 : 只支持二进制(b)模式 , 以当前位置为参考系 2模式 : 只支持二进制(b)模式 , 以文件末尾为参考系

文本模式实例如下:

代码语言:javascript
复制
# 在a.txt文件中写入‘python编程’
# 文本模式0模式
with open(r'a.txt', 'rt',encoding='utf8') as f:
    # 查看python,读六个字符
    print(f.read(6))
    # tell()方法查看光标移动了几个字符
    print(f.tell())
    # 结果
    # python
    # 6
    '''0模式光标从文本开始控制光标移动三个字符,正数从左到右再读取剩下的内容,pyt去掉,输出hon编程'''
    f.seek(3,0)
    print(f.read())
    # 结果
    # hon编程

二进制模式实例如下:

代码语言:javascript
复制
# 在a.txt文件中写入‘python编程’
# 二进制模式
with open(r'a.txt', 'rb') as f:
    # 输出读取六个字节的内容
    print(f.read(6))
    # 查看光标移动了几个字节
    print(f.tell())
    # 结果
    # b'python'
    # 6

# 0模式,光标每次从头开始
# 光标从头移动六个字节,然后再读取三个字节的内容解码,输出‘编’字
with open(r'a.txt', 'rb') as f:
    f.seek(6, 0)
    print(f.read(3).decode())
    # 结果:编


# 1模式,光标在当前位置
# 光标从头开始,先移动6个字节,到python后
with open(r'a.txt', 'rb') as f:
    f.seek(6,1) # 保持光标在python字符后不移动
    # 输出python后三个字节的内容,’编‘字
    print(f.read(3).decode())
    # 结果
    # 结果:编

# 2模式,光标在末尾
# 光标从文件末尾,反向移动12个字节到文件开始
with open(r'a.txt', 'rb') as f:
    f.seek(-12,2)
    # 输出‘python编程’
    print(f.read(12).decode())
    # 结果
    # python编程

文件移动小练习

代码语言:javascript
复制
# 小练习:实现动态查看最新一条日志的效果
import time
with open('a.txt', 'rb') as f:
    # 保持光标在文件末尾,来监视是否添加内容
    f.seek(0, 2)
    while True:
        line = f.readline()
        if len(line) == 0:
            # 没有内容
            time.sleep(0.5)
        else:
            print(line.decode('utf-8'), end='')
            
 '''在a文件内输入内容后保存,才能实时监控'''

文件内容的修改

文件修改的两种方式(底层原理)

  • 覆盖原内容
  • 新建内容,删除原内容 , 重命名文件替代

实例如下:

代码语言:javascript
复制
# 修改文件内容--覆盖
with open(r'a.txt','r',encoding='utf8')as f:
    data = f.read()
    print(data)
    # print(data)
with open(r'a.txt','w',encoding='utf8')as f1:
    # 用replace方法覆盖
    rep_data = data.replace('python','C++')
    f1.write(rep_data)
    
# 删除原文件,重命名文件替代 
import os
with open('a.txt', mode='rt', encoding='utf-8') as read_f, \
        open('a.txt.swap', mode='wt', encoding='utf-8') as write_f:
    for line in read_f:
        write_f.write(line.replace('C++', 'python'))
os.remove('a.txt')  # 删除原文件
os.rename('a.txt.swap', 'a.txt')  # 重命名文件
  1. 覆盖文件的优缺点:
  • 优点 : 不会占用资源 , 直接覆盖原文件的内容达到删除的目的
  • 缺点 : 如果没有覆盖原文件 , 底层会保留数据 , 可以通过数据恢复来获取数据不安全
  1. 删除原文件,重命名新文件优缺点:
  • 优点 : 不会导致文件过大而内存溢出
  • 缺点 : 在删除原文件前 , 同一个时间 , 复刻了两个文件,占用了资源
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文件操作
    • 文本模式和二进制模式下read()方法的使用
      • 文本模式
      • 二进制模式
    • 文件内光标的移动
      • 文件内容的修改
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档