Python教程

python-文件操作(二)

本文主要是介绍python-文件操作(二),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录
  • 文件操作
    • 文本模式和二进制模式下read()方法的使用
      • 文本模式
      • 二进制模式
    • 文件内光标的移动
    • 文件内容的修改

文件操作

image

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

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

文本模式

  • 格式:read( n ),n为数字

  • 文本模式下n表示字符个数

实例如下:

# 在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表示字节个数

实例如下:

# 在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)模式 , 以文件末尾为参考系


    文本模式实例如下:

# 在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编程

二进制模式实例如下:

# 在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编程
    

文件移动小练习

# 小练习:实现动态查看最新一条日志的效果
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文件内输入内容后保存,才能实时监控'''

文件内容的修改

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

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

实例如下:

# 修改文件内容--覆盖
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. 删除原文件,重命名新文件优缺点:
  • 优点 : 不会导致文件过大而内存溢出
  • 缺点 : 在删除原文件前 , 同一个时间 , 复刻了两个文件,占用了资源

image持续更新中···

这篇关于python-文件操作(二)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!