一、文件读写模式
python文件的读写很简单,仅仅是一个open函数。
打开文件方式有:
open(绝对路径/'文件名’,读写模式,encoding='utf-8'),open这种方式打开文件,操作后,要关闭文件;
with open('文件名‘,读写模式,encoding='utf-8')as f.with这种方式打开文件,自动会关闭文件。
文件操作的三步骤:
1、打开文件获取文件句柄,句柄就理解是这个文件;
2、通过文件句柄操作文件
3、关闭文件
注意:理解句柄的概念
在stdio.h中声明
typedef struct{
short level;//缓冲区满与空的程度
unsigned flags;//文件状态标志
char fd;//文件描述符
unsigned char hold;//无缓冲区,不读字符
short bsize;//buffer大小
unsigned char*curp; //当前指向
unsigned istemp;//临时文件知指示
short token;//有效性检测
} FILE;
为了管理打开的文件,系统为所有文件创建了一个打开文件信息的结构体数组,文件句柄就是每个文件的唯一标识符,是文件在内存中的存储位置。句柄顾名思义,打开后要关闭才能再次打开。所以更新文件后,一定要先关闭文件,再次读取读到更新后的文件内容。
文件读取模式:
fr=open('a.txt','r')print(fr.read())
fr.write('qiuqiqu,123456QQ')print(fr.read())
运行结果:
liuyihan,123456YH
Traceback (most recent call last):
File"E:/自动化测试/LYH_python/Day4作业/file.py", line 3, in fr.write('qiuqiqu,123456QQ')
io.UnsupportedOperation:not writable
r:只读模式,打开不存在的文件时,报错;读完文件后,文件指针在末尾
w:只读模式,会清空原来的文件内容;打开不存在的文件时,直接帮你新建一个文件;
a:追加写模式,在原文件内容末尾追加新内容;打开不存在的文件时,直接帮你新建一个文件。
r+:可读,可写,可追加模式,打开不存在的文件时,帮你新建一个文件。
a.txt文件内容:、
liuyihan,123456NN
qiuuqiu,123456QQ
nuanuan,123455NN
fr=open('a.txt','r+')
fr.write('niuhanyang,123456NN')print(fr.read())
运行结果:
qiuqiu,123456QQ
nuanuan,123455NN
以上程序,你有看懂吗?文件写时,文件指针在首行,所以liuyihan,123456YH 被修改为niuhanyang,123456NN,这时文件指针在第二行。读取文件时,read()将第二行和第二行以后的内容读出来。所以显示结果如上图所示。
w+:写读模式,写时会把原来文件内容清空,可读取已写入的文件内
a+:追加读写内容,不存在的文件会自动创建,存在则只追加内容。
file.txt文件内容:
liuyihan,123456YH
qiuqiu,123456QQ
fr=open('a.txt','a+')
fr.write('niuhanyang,123456NN\n')
fr.seek(0)print(fr.read())
运行结果:
liuyihan,123456YH
qiuqiu,123456QQ
niuhanyang,123456NN
上面程序,若不加fr.seek(0),读取结果为空,因为追加写,文件指针在末尾,读取时读不到东西,seek()方法就是把文件指针指向那个位置。0代表首行。
二、文件操作方法
f = open('file.txt','a+',encoding='utf-8')
f.read()#读取文件所有内容,返回字符串类型
f.readline()#读取文件第一行内容,返回一个List
f.readlines()#一行一行读,获取文件所有内容,返回一个List,文件的每行内容作为List的每个元素
f.write()#将字符串写入文件,只能是字符串类型
f.writelines()#将一个序列字符串列表写入文件,需要换行时自己手动添加\n
f.seek(0)#文件指针指向哪个位置
f.tell()#获取当前文件的指针指向
f.flush()#写入数据后,立即把数据从内存写到磁盘中
f.truncate()#清空文件内容
import os
os.remove('file.txt')#删除文件
os.rename('file.txt','new_file.txt')#文件重命名
注意:用上方read()和readlines()方法操作文件时,当文件很大时,会将文件所有内容读到内存中,很容易引起内存撑爆。高效的操作就是,读一行操作一行,然后读过的内容从内存中释放。如以下代码:
三、修改文件
修改文件有两种方式:
第一种:读取文件所有内容,将文件内容修改后,清空文件所有原内容,再将修改后的文件内容重新写入;
注意:指明文件绝对路径时,路径中若含有\t、\n、\s等转义字符,在路径前加r,意思是文件路径中的\t、\n等不是转义字符。
第二种:将修改后的内容写入一个新文件。
四、处理json字符串
S='''{
"error_code": 0,
"stu_info": [
{
"id": 309,
"name": "小白",
"sex": "女",
"age": 26,
"addr": "河南省济源市北海大道32号",
"grade": "天蝎座",
"phone": "18512572946",
"gold": 100
},
{
"id": 310,
"name": "小黑",
"sex": "男",
"age": 26,
"addr": "河南省济源市北海大道32号",
"grade": "天蝎座",
"phone": "18516572946",
"gold": 120
}
]
}'''mport json
res= json.loads(S) #json串(字符串),转成字典
print(res)#打印出字典
stus={'xiaojun':'123456','xiaohei':'7891','tanailing':'11111','海龙':'111'}#定义一个字典
res2=json.dumps(stus,indent=8,ensure_ascii=False)#将字典转换成json字符串,Ensure_ascii=False是防止中文报错
print(res2)#打印出json字符串
with open('stus.json','w',encoding='utf-8') as f:#将字典转换成json字符串,然后再写入文件stus.json中
f.write(res2)
以上程序,最终创建了一个stus.json文件,里面内容为json类型
4.1如何从文件中读取json数据
第一种方式:用loads(),将文件的所有内容读出来(json字符串类型),转换成字典,再打印出字典,从而获取到文件内容
第二种方法:用load(),直接操作文件,将json字符串转换成字典,再打印出字典,从而获取文件内容。
4.2 如何将json数据写入文件
第一种方法:用dumps(),将字典转换成json字符串类型,再写入文件
第二种方法:用dump(),直接操作文件,传入字典和文件,将字典直接转换成json字符串类型,写入文件。
、
注意:从上述程序,不难发现,很好记忆,带s的函数是处理json字符串的,不带s的可直接处理文件。