1.文件读写
文件读写步骤:
打开文件:
open(‘文件名称’,‘打开方式’)
#文件的操作
#打开文件 open
#默认的编码是gbk,也就是中文编码
#也可以在打开文件时给它指定一个编码类型
#w模式会在文件已存在的情况下,会将文件原来的内容覆盖
fobj = open('./Test.txt','w',encoding='utf-8')
#读/写文件
#写文件
fobj.write('写入信息')
#close()相当于保存加关闭,关闭之前会自动保存
fobj.close()
#以二进制的形式去写数据
#效果其实差不多,只不过是写入模式的不同
fobj = open('Test.txt_!','wb')
fobj.write('二进制写入数据'.encode('utf-8'))
fobj.close()
#a模式是追加数据,不会将原来文件内容覆盖,如果文件不存在也会创建
#ab模式则是以二进制形式来追加,原理和a模式一样
fobj = open('Test.txt_!','a')
fobj.write('追加的数据不会覆盖\r\n')
#如果转成utf-8编码的话会将字符串变成字节
#而a模式下只可以输入字符串,所以不可以转码
fobj.close()
#读文件
#1.打开文件
#f = open('Test.txt','r')#r--只读形式打开
f = open('Test.txt','rb')#rb--以二进制的形式读取数据
#2.文件操作
print(f.read())#读取所有的数据
print(f.read(3))#定义读几个数据,如3个数据
print(f.readline())#读一行数据
print(f.readlines())
#readlines() 按行读取,
# 一次性读取所有内容,返回一个列表,每一行内容作为一个元素
#如果读取了二进制的数据,可以通过解码的方式转换为指定的格式
#print(f.decode('gbk'))
#3.将文件对象关闭
f.close()
#with上下文管理
#with语句,不管在处理文件过程中是否发生异常,都能保证with语句执行完毕后已经关闭打开的文件句柄
#也就是自动加close()
with open('Test.txt','r') as f:
print(f.read())
小结:
文件读写的几种操作方式:
read— r,r+,rb,rb+
r , r+ – 只读 – 适用于普通的读取场景
rb , rb+ 适用于 文件 图片 视频 音频 这样的文件读取
write — w w+ wb wb+ a ab
w wb+ w+ – 每次都会去创建文件
(二进制读写时,要注意编码问题,默认情况下,写入文件的编码时gbk)
a ab a+ – 在原有的文件的基础之后去文件指针的末尾去追加
文件操作–文件备份例子:
#文件的备份
def copyFile():
#接受用户输入的文件名
old_file = input('请输入要备份的文件名')
#因为要获取对应的文件名和文件的格式,所以要用“.”分割数据,存入列表
file_list = old_file.split('.')
#构造新的文件名.加上备份的后缀
new_file = file_list[0]+'_备份.'+file_list[1]
#转移数据
old_f = open(old_file,'r')#打开需要备份的文件
new_f = open(new_file,'w')#以写模式去打开新文件,不存在则创建
content = old_f.read()#将文件内容读取出来
new_f.write(content)#将读取的内容写入到备份文件
old_f.close()
new_f.close()
pass
copyFile()
#如果处理超大文件,依次将全部内容读取出来显然是不合适的,因此要优化一下
def copyBigFile():
#接受用户输入的文件名
old_file = input('请输入要备份的文件名')
#因为要获取对应的文件名和文件的格式,所以要用“.”分割数据,存入列表
file_list = old_file.split('.')
#构造新的文件名.加上备份的后缀
new_file = file_list[0]+'_备份.'+file_list[1]
#使用for循环,逐渐读取文件
# 使用try catch处理错误的逻辑
try:
with open(old_file,'r') as old_f,open(new_file,'w')as new_f:
while True:
content = old_f.read(1024)#一次读取1024个字符
new_f.write(content)
#循环出口
if len(content)<1024:
break
except Exception as msg:
print(msg)
pass
2.文件定位
#1.tell()--返回指针当前所在的位置
with open('Test.txt','r') as f:
print(f.read(3))
print(f.tell())#6--每一个汉字两字节,所以当前位置为6
print(f.read(2))
print(f.tell())#每次读取时,文件指针随着上次位置继续走
#2.truncate -- 可以对源文件进行截取操作,截取后原文件内容也会相应发生变化
fobjB = open('Test.txt','r')
print(fobjB.read())#鍐欏叆淇℃伅
fobjB.close()
print('截取之后的数据。。。。')
fobjA = open('Test.txt','r+')
fobjA.truncate(4)
print(fobjA.read())
fobjA.close()#鍐欏
#3.seek() -- 可以将文件指针定位在其他位置在进行相应操作
#seek(offset,from)有两个参数,offset,偏移量单位字节,负数为往回偏移,正数是向前便宜
#from位置:0表示文件开头,1表示当前位置,2表示文件末尾
#如 f.seek(-2,1)#相当于光标从当前位置往回走两个位置
with open('Test.txt','rb') as f:
data = f.read(2)#鍐
print(data.decode('gbk'))#二进制读取后要解码为中字
f.seek(-2,1)#相当于返回了原点位置
print(f.read(2).decode('gbk'))#鍐
#注:如果只用'r'的方式读取文件,没有使用二进制的选项打开,只能从文件的头部开始读取