读写文件是最常见的IO操作。Python内置了读写文件的函数。
Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError的错误。
![8185effc59423747aa5083a002caaa2f.png](https://i-blog.csdnimg.cn/blog_migrate/b81dd1a4c8e88427f9dd235eca119127.jpeg)
完整的语法格式为:
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
参数说明:
- file: 必需,文件路径(相对或者绝对路径)。
- mode: 可选,文件打开模式
- buffering: 设置缓冲
- encoding: 一般使用utf8
- errors: 报错级别
- newline: 区分换行符
- closefd: 传入的file参数类型
读文件
要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和打开模式。读文件的打开模式可以不传,默认就是mode='r'。
![e60ea5d73dc58b149d426a2ea52801dd.png](https://i-blog.csdnimg.cn/blog_migrate/bdf53efb0ba9cdc9051a8862351ded04.jpeg)
./ 当前目录(当前文件);../ 上级目录(上级文件)。
![e3dc1774753d2330a31e783aa66dad43.png](https://i-blog.csdnimg.cn/blog_migrate/e1cf92cc926bdffdeecba895cf35af06.jpeg)
打开模式'r'表示读,这样,我们就成功地打开了一个文件。
![38611285d0d932bfda807987b5e8e1da.png](https://i-blog.csdnimg.cn/blog_migrate/9dc0f0085976592c3587e798f3cb13a7.jpeg)
如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在。由于我要打开的文件存在,所以不会报错。
还有一个问题如果内容中有中文用f = open(path,'r')去读文件又会报编码错误。所以正确的方法传三个参数最好:传入文件名、打开模式和编码参数。
![47c92b0503f327d0788155191e106e81.png](https://i-blog.csdnimg.cn/blog_migrate/002c64408ea81d84d40998de1702c227.jpeg)
编码(encoding)推荐utf-8(也可以写成utf8)这样无论中文、英文或者混合的文件都可以读。其中打开模式mode=可以不写,直接参数。因为第一参数文件名必须,打开模式是第二参数,编码是第四参数所以不能省略。
如果要读取图片或者音频文件,打开模式就用'rb',b代表二进制。
![a7d3a92f398cf25621d70f36bf8f1fb8.png](https://i-blog.csdnimg.cn/blog_migrate/9426e32ea7d475f7c37044f653029b13.jpeg)
读取文件怎么操作内容
- read():一次性读取文件的全部内容
- readline():每次读取一行内容
- readlines():一次读取所有内容并按行返回列表
read()
如果文件很小,read()一次性读取最方便。
![406cbb315451ddbc9bc6e01accf62e02.png](https://i-blog.csdnimg.cn/blog_migrate/41ea64555c261a3f967c2a9d2b9a393c.jpeg)
输出结果
![5faa6b171adc4ac551e331fdad63d081.png](https://i-blog.csdnimg.cn/blog_migrate/3d1bade55504ebd94da62d27be1c53b9.jpeg)
如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。
文件的内容一部分
![28a79e472c72e2c14f2311ba151e53cb.png](https://i-blog.csdnimg.cn/blog_migrate/66471caa7b82ec01c831aed0d2d3a38c.jpeg)
read(size)
![5a1aa0bdfcece0a5fba682c0a5ca05e7.png](https://i-blog.csdnimg.cn/blog_migrate/36fdb5e106be312a0b501499c8d9acb5.jpeg)
输出结果
![6e6c3f48c0fea98cc8d406358401ccde.png](https://i-blog.csdnimg.cn/blog_migrate/79fd358b0ef5d8bda094741695325710.jpeg)
readline()可以每次读取一行内容
![1facfd4fd10d27d737710942565d282d.png](https://i-blog.csdnimg.cn/blog_migrate/1b26ca6ada624062bcdbf92d78a98eb4.jpeg)
输出结果:空行也算一行
![80975cfc7724b378bd02eef34f904954.png](https://i-blog.csdnimg.cn/blog_migrate/85ca527fd1e60c296800ab20a3cad059.jpeg)
readlines():一次读取所有内容并按行返回列表
![3d01b5dfd720c5c1ff9b2201365d28d5.png](https://i-blog.csdnimg.cn/blog_migrate/9752397c400a3ac29af3cf5e391f99fe.jpeg)
输出结果
![a3582bc90877cc858e6ab3eab0f84d60.png](https://i-blog.csdnimg.cn/blog_migrate/aef8437ba5805bc98ae46edab7e092a4.jpeg)
可以用for...in...来循环取内容。
![a10d26fd5c084392c39676737a326a25.png](https://i-blog.csdnimg.cn/blog_migrate/4d3b7a92a181e6468fd504201761cf9e.jpeg)
既然是列表就可以用切片
![14e6c89c18f9ad6872967768dc2adf41.png](https://i-blog.csdnimg.cn/blog_migrate/1a0b2e36377ad96ff9e366cc7945888b.jpeg)
写文件
写文件和读文件是一样的,唯一区别是调用open()函数时,文件打开模式把'r'换成'w'或者'a',表示写文本文件。
无论'w'或者'a',如果该文件不存在,创建新文件。
区别就是:
'w',如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。
第一次写入内容,w.txt文件不存在,自动帮你创建w.txt。
![eb5f3292bfb506cd698ef730054cc362.png](https://i-blog.csdnimg.cn/blog_migrate/574c0139a1a69cd0200a8be0152b6b2d.jpeg)
![820a4ff8fc44227aefc8ed902061441b.png](https://i-blog.csdnimg.cn/blog_migrate/6ea17934d37577e172210f694a752c02.jpeg)
第二次写入内容,w.txt已经存在,就把第一次写入的内容删掉,再把第二次内容写入。
![d9074fac6bbe2fbed9523cb8a38e7a59.png](https://i-blog.csdnimg.cn/blog_migrate/2cd47c27db787345d23f5450c039ca81.jpeg)
![58523678c9cfebc2722f61315bdb0ef2.png](https://i-blog.csdnimg.cn/blog_migrate/7aece4a0fab578b33571a8ccea7c8efe.jpeg)
'a',打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。
第一次写入内容,a.txt文件不存在,自动帮你创建a.txt。
![b07a68c726beb7488b376bd2e81f9672.png](https://i-blog.csdnimg.cn/blog_migrate/4de29a2505899c5d37a0ada9d495b506.jpeg)
![348ef6c1f118f87e0fcf78b8917df7bd.png](https://i-blog.csdnimg.cn/blog_migrate/93f1b2237582212d2a3213d1c9c411b7.jpeg)
第二次写入内容,a.txt已经存在,直接在第一次写入内容的后面把第二次内容写入。
![644165b8c31fd07c79826e585c4e1c5a.png](https://i-blog.csdnimg.cn/blog_migrate/004ba3e0a61a00ce2fe223569897e450.jpeg)
![05f0acfa0cbef5fc12342b69873000f0.png](https://i-blog.csdnimg.cn/blog_migrate/c22dba7360d4dd058655e0e0e851cf67.jpeg)
close(),无论是读还是写文件都要打开文件,打开就要关闭文件,要不然一直打开不关闭,内存顶不住。所以打开就要要关闭文件。
![c6b40d6f27e0e7c85a3866c4da5db6bd.png](https://i-blog.csdnimg.cn/blog_migrate/27cc63355fa794bee04a3a3a4b8d671e.jpeg)
每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法。注意缩进。
在Python中,文件读写是通过open()函数打开的文件对象完成的。使用with语句操作文件IO是个好习惯。
![e9f64beda058d28fe4f65499088c4f0a.png](https://i-blog.csdnimg.cn/blog_migrate/6f4d20390705ecd11a8354e7e3f6ebfe.jpeg)
mode模式主要几种:
- +:打开一个文件进行更新(可读可写)。
- r:以只读方式打开文件。默认模式
- b:二进制格式打开
- w:打开一个文件只用于写入。
- a:打开一个文件用于追加。
需要二进制就后面rb、wb、ab,其实加号(r+、w+、a+)我试了跟没加效果没有多大区别。总之可以组合。
写一个index.html
![53e407ad15c72323f7478b31b3c9aeae.png](https://i-blog.csdnimg.cn/blog_migrate/0e3b4d26525e10569518a8fc69c8eacc.jpeg)
生成文件中的html代码
![9a6122d1425d4fec26d6ade371f4b807.png](https://i-blog.csdnimg.cn/blog_migrate/9303d9f87573976f541532139df720b4.jpeg)
浏览器效果
![15c9b80f95e64a7eb022725d89cf7e3e.png](https://i-blog.csdnimg.cn/blog_migrate/7cc167318c63b21f8582cd4441e5f278.jpeg)
读写文件内容的基础差不多就是这么多,往后需要多练、多写来加深记忆。