- 本教程为python3文档解读
- 本教程面向完全型小白,只要你会在电脑上打字,那你就可以看懂。
- 参考视频观看,味道更加:https://space.bilibili.com/186584185/#!/video
- 建议优先阅读本系列的《编程的本质》这一章节。
- 推荐阅读:《跟我读python3文档:016_带你手撕程序,展现一个函数如何从思路到实现》
贯穿始终的理念:别废话,就是干!
往期回顾:
- 匿名函数lambda
- 列表推导式
- 数据结构
- 模块
文档解读
python3文档第七小节链接地址:7.2. Reading and Writing Files
本章主要讲解7.2. Reading and Writing Files(读写文件)这个小节
作者:咖喱py
文件读写这部分相对好理解一些,就是:
- 打开文件 ➡️ 读文件 ➡️ 关闭文件
- 打开文件 ➡️ 写文件 ➡️ 关闭文件
我们把这三部分分开讲:
第一部分:打开文件
这一部分会略带一点读写文件的内容。
读文件就是用读模式打开文件,用读方法读取文件;
写文件就是用写模式打开文件,用写方法写入文件。
关键词就是:模式、方法
注意:读和写,是分开的两件事情!
接下来我们来看这两件事情的异同之处。
>>> f = open('workfile', 'w')
- open( )函数打开文件,
- 函数的第一个字符串参数代表文件,
- 函数的第二个字符串参数代表模式,例如读或写,常见的有如下模式字母:
字母 | 模式意义 |
---|---|
'r' | 读取文件 |
'w' | 写入文件,如果文件存在,则替换文件 |
'a' | 续写文件 |
'b' | 二进制模式,常与其他字母组合使用 |
其他模式字母请参考文档:模式字母
有些模式可以相互组合,比如:
- 在模式后面加上b模式,可以进行二进制数据处理
- 加上+(加号),代表我们可以对文件进行读和写
可能+(加号)那里你有点不理解他的意思。因为你还没有明白,“读和写是两件事”是什么意思。
我们继续往下看例子,你很快就能明白。
写入文件:
- 在写模式下,用写方法,即write( )方法
>>> a = open('test.py', 'w') #用写模式打开文件,把文件对象赋值给a。
>>> a.write('This is the entire file.\n') #用write()方法写入文件
25 #打印出写入的字符数量
读取文件:
- 在读模式下,用读方法,即read( )方法
>>> b = open('test.py', 'r') #用读模式打开文件,把文件对象赋值给b。
>>> b.read() #用read()方法读文件
'This is the entire file.\n' #文件内容被打印出来
下面来体验一下什么叫做:读和写是两件事
在读模式下,用write( )方法
>>> c = open('test.py', 'r') #用读模式打开文件,把文件对象赋值给c。
>>> c.write('galipy') #尝试在读模式中,写入内容。
Traceback (most recent call last): #程序出错
File "<stdin>", line 1, in <module>
io.UnsupportedOperation: not writable
注意报错的最后一句话,写明了不支持写入操作。
也就是说,我们在读模式,就只能读取文件,不能写入文件。
在写模式,就只能写入文件,不能读取文件。
现在明白“读和写是两件事”是什么意思了吧。
相当于,如果你以读模式打开文件,那就只能读取文件;如果还想要写入文件,就只能用写模式再打开一遍文件。
那么有没有什么办法可以简化一下这个步骤呢?
答案就是:添加+(加号)模式。
>>> c = open('test.py', 'r+') #用读模式与加号模式打开文件,把文件对象赋值给c。
>>> c.write('galipy') #尝试在读模式中,写入内容。
6 #返回写入的字符数量
第二部分:读写文件
这部分其实是讲读写文件的细节的
我们在进行读或写操作时,一定要时刻明白自己是从哪里读,读到哪了?从哪里写,写在哪了?
你可能会天真的理解为从头读,从头写。
但实际情况可能和你想的不太一样。
长者怎么说的来着?
图样图森破~
读文件
#假设你有一个test.py文件,里面只写了一句话:'This is the entire file.'
#现在我们要读取它
>>> b = open('test.py', 'r') #用读模式打开文件,把文件对象赋值给b。
>>> b.read() #用read()方法读文件
'This is the entire file.\n' #文件内容被打印出来
#如果我们再次调用read()方法会怎么样?它会从哪开始读?还是从头吗?
>>> b.read()
''
#是不是没有得到你想要的结果?
现在明白这个从哪读到底是从哪读了吗?
当你第一次启动read( )方法时,它的确是从头开始读的,但是当你第二次调用read( )方法时,它是接着上一次调用开始读的。
write( )方法也是一样。如果你连续调用,那么他会连续接着写。
这样有什么好处呢?这样可以让我们一次只读取一部分,然后接着读下一部分。
比如你有一个50G的文件,但你的电脑就2G内存,你要怎么办呢?如果你直接一次性打开,估计你的电脑就死机了。。。所以,我们需要分多次读取。
>>> c.read(20) #一次读取20个字符,然后多次调用
分次读取还有一些其他的方法,比如:
c.readline() #一次读取一行
或者
>>> for a_line in c: #用循环遍历的方法一次读取一行
... print(a_line, end='')
...
This is the first line of the file.
Second line of the file
如果你想要读取文件中所有的行,你也可以使用 list(f) 或 f.readlines()。
写文件
一开始我们已经接触过写文件了,那么它有哪些需要注意的呢?
关键点在于write( )方法的参数!
这个参数必须是一个字符串!
也就是说,我们只能往文件里写入字符串类型!
不能是整数类型,不能是列表类型,不能是其他任何类型!
一定要记住write()方法的参数是字符串类型这一点,因为我们在讲解json时,还会用到这点。
>>> a = open('test.py', 'w') #用写模式打开文件,把文件对象赋值给a。
>>> a.write('This is the entire file.\n') #用write()方法写入文件
25 #打印出写入的字符数量
要想写入其他类型,我们也需要先把它们转化为字符串类型在写入
>>> value = ('the answer', 42)
>>> s = str(value) #把元组类型转化为字符串类型了
>>> f.write(s)
18
读写文件的主要细节就这些,不过还有一些拓展方法值得学习:
- tell()方法
查看读取到的位置 - seek(offset, from_what)方法
设置读取位置
具体使用方法,请自行学习~
第三部分:关闭文件
为了保证文件内容的正确性,同时,为了节约内存的使用,我们每次对文件进行完操作之后都要关闭文件。
>>> a = open('test.py', 'w') #用写模式打开文件,把文件对象赋值给a。
>>> a.write('本文作者是咖喱py.\n') #用write()方法写入文件
11
>>> a.close() #用close()方法关闭文件
但是,一般情况下,我们的文件操作都是通过脚本文件执行的。一旦程序运行出错,我们的close()操作可能就无法执行。
为了保证close()正确执行,于是我们就要用到try和finally两个关键字。
注意!从现在开始,我们要写脚本文件了,不再只是在交互模式里过家家了。
新建脚本firstFile.py
输入如下内容:
myfile = open('test.py','r')
try:
for line in myfile: #注意缩进关系
print(line, end='')
finally:
my file.close()
文件会执行try语句块中的内容,不论此语句块中的内容能不能成功运行,程序最后都会去执行finally语句块中的内容。
这样就可以保证close()这个关闭操作100%运行了。
但是,就像我最开始那期的文章里介绍的,程序猿都是懒惰的,每次都输入那么多很麻烦。
下面给出精简办法,用with、as关键字:
with open('test.py','r') as myfile:
for line in myfile:
print(line, end='')
这三行代码和上面的六行代码做的是相同的事情。只不过有些操作被隐藏了起来。
参考着上面的try、finally语句块,试试自己理解with、as语句块发生了什么~
by_ 咖喱py
今天就讲到这里吧~
记住write( )方法的参数特点哟~下期讲解json将会用到~
最近发现文章被盗的很凶,而且还不署名。。。
你们的良心不会痛嘛~
网友评论