ha = open('陈粒',encoding='utf-8') (文件句柄) #陈粒文件在存的时候是用utf8编码格式转换成二进制byte类型存在硬盘上,打开文件默认是用
#操作系统编码格式,如果不申明原来文件是用什么编码(encoding),则打开文件(open)过程会自动
#用操作系统编码格式解码(decoding),两码不一致就会出现报错,解码不
haa = ha.read()
print(haa)
ha.close()
#文件本身在硬盘是二进制byte(字节)类型存放,无法直接修改。都是通过软件打开文件,加载到内存中再修改,然后覆盖掉原来硬盘上的文件。所以文件修改的本质是覆盖
ha = open('陈粒',r,encoding='utf-8') #可读方式打开 #w可写方式打开。注意此处可写会直接清空原文件再写,文件不存在就创建 #a 追加
#读的时候都是根据光标位子来的
print(ha.readable()) #是否可读
print(ha.readlines()) #多行读取,注意输出的是列表形式
r+ a+ #里面写都是从光标位子开始写,进行覆盖
with open('陈粒','w+',encoding='utf-8') as ha:
ha.write('这是第一行\n')
ha.write('这是第二行')
print(ha.read())
#w+ 是直接创建新文件写再覆盖原来文件 打印出来空 说明只要是W就会清空原文件,创建一个新文件提供写,写好后覆盖原文件 本质上只要修改文件就会有2个人文件产生,新的覆盖旧的
print(f.tell()) #打印当前的位子 出来的数字是在文件的位数,utf8是汉字3位,英文1位,由此可推出屋里位子多少
f.seek(0) #换到哪个位子
f.seek(10) #换到第10个字符编码 注:seek和truncate都是按字符编码位来算的
f.flush() #刷新 :在写文件时,先储存在内存上,默认满了再写到磁盘上 这在写文件遭遇停电是非常可怕的
f.truncate(30) #从开头到第30位开始截断 就算移动seek ,也是从头开始截断 注意是这是一种写的操作,截取以外的全部删除
#注意除了read(按字符来算位子),其余读取都是按字节来算的
注意:改动都是对文件之间进行修改的方法,无需赋值 ,查询除外
seek的另外用法
seek默认从0位开始算
seek(11,1) 表示光标从上一次停留的地方开始往下面移动
seek(-11,2) 表示光标从最后开始向前移动 注意,不管哪种方,加了光标起点都要以字节形式打开,不然报错
num = -10 实现了读取最后一行的功能
with open('陈粒','rb') as ha:
seek(num,2)
ha_list = ha.readlines()
while True:
if len > 1:
print(ha_list[-1].decode()) 注意 在文件中,如果执行了读的操作,光标都会改变,比如readlines读完了结果输出一个列表,再次执行的话就会是空白列表。要想把之前读的结果保留,就需要赋值一个变量
break
else:
num*=2
with open('陈粒',r,encoding='utf-8') as ha: #以这种方式打开省去了文件操作结束要关文件的操作,赋值用as 后面接文件句柄名
ha.read()
关于二进制打开文件 #不用加encoding 解码格式 应为rb 本来就是以原始的方式打开,你在增加encoding编码就之相矛盾
with open('陈粒','rb') as ha: #文件都是以字节(byte)类型存在硬盘上,我们普通读取文件都是先解码(decode)处理过后变成我们人看的懂得语言,而byte是直接原封不动的取硬盘上的数据, 注意(文件原先字符编码不同,存在硬盘上同一个数据可能存的byte个数和数据不同)
print(ha.read()) #为什么要以byte类型打开数据,当你存的文件里面包含视频,音频,或者其他类型的数据,用字符串形式打开文件无疑是行不通的,数据都是存的byte,原封不动打开,然后各个系统平台都能用,经过字符编码处理可以还原出来。
whith open('陈粒','wb') as ha:
ha.write(bytes('名字',encoding = 'utf-8')) #把字符串通过bytes函数变成byte类型,需要指定你‘名字’字符编码格式
ha.write('名字'.encode()) #第二种方式直接encode() 编码变成byte类型
with open('陈粒','r',encoding='gbk') as ha: #陈粒是utf-8编码的,我用GBK字符编码打开,没问题。但是下一步系统会根据你提供的GBK进行解码,原来一个汉字站三个字节,这边就会把三个字节分开,两个字节,两个字节进行解码,如果能在GBK编码表中找到对应字符,不会报错
print(ha.read()) #只是出现乱码,但是如果找不到对应字码表,就会报错。
跑程序中遇见的问题与感悟
关于文件操作的一些细节,用byte打开文件是没有可以在r+,w+,a+上面加b的,就是不能实现即用byte打开,也能读或者进行修改,只能选着两样 没有b+的选项 在a+中,开始光标就在最后一位,读取值为空,除非移动光标
注意,在打开文件过后,想写入数据到文件中, 如果不是byte打开,打开的文件其实都是通过解码读出来的,读出来的东西都是字符串(仅仅是文件,不是执行程序,执行程序存的时候依然是字符串,但是编码出来后,程序运转会识别程序中各种类型函数),写入的时候必须是字符串类型
文件打开应该注意用什么方式发开 写的时候因该注意写入数据类型和文件光标位子