目录
英文字符统一使用一个bytes来表示,中文字符统一使用三个bytes来表示
实例如下:
# 在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
编程
实例如下:
# 在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模式 )
文本模式实例如下:
# 在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') # 重命名文件