英文字符统一使用一个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( )方法格式:
三种模式详解:
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') # 重命名文件
持续更新中···