Python之文件操作

一、文件读写模式

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 <module>
    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()#读取文件第一行内容,返回字符串类型
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的可直接处理文件。

posted @ 2018-09-05 22:26  Balllyh  阅读(889)  评论(0编辑  收藏  举报