69. open函数—打开文件并返回文件对象
文章目录
- 69. open函数—打开文件并返回文件对象
- 1. open() 函数的作用
- 2. open函数语法参考
- 3. open()函数参数说明
- 1. file参数
- 2. encoding 参数
- 3. errors参数
- 4. mode参数
- 4. mode参数详解
- 1. 准备工作
- 2. w 写入模式
- 3. a 追加模式
- 4. r 只读模式
- 5. 总结
- 1. 代码总结
- 2. 路径的转义
- 3. mode模式
- 4. 图片总结
1. open() 函数的作用
open[ˈəʊpən]:打开。
open的中文释义是打开。
open( )
函数的作用是打开文件。
【返回值】
open函数返回的是一个文件对象。
2. open函数语法参考
open 函数语法如下:
open(file, mode='r', encoding='None', errors='None')
file[faɪl]:文件。
mode[məʊd]:模式。
encoding[ɪnˈkəʊdɪŋ]:编码。
errors[ˈerəz]:错误。
none [nʌn]:没有。
open( )函数中的参数还有很多,这里介绍4个常用参数。
3. open()函数参数说明
1. file参数
file[faɪl]:文件。
file 是必需参数。
参数file 表示要打开文件的路径。
路径可以是绝对路径,也可以是相对路径。
绝对路径是指文件在硬盘上真正存在的路径。
相对路径是针对当前文件夹这一参考对象,来描述文件路径的形式。
参考《68.Python的相对路径》。
2. encoding 参数
encoding[ɪnˈkəʊdɪŋ]:编码。
参数 encoding 表示文件的编码方式,文件编码方式一般为 ‘utf-8’。
为了避免程序报错或者读取到的内容出现乱码,需要把 encoding 设置为 ‘utf-8’,即写为 encoding=‘utf-8’。
编码的详细知识,以后在做详细介绍。
3. errors参数
errors 参数表示读写文件时碰到错误的报错级别。
strict [strɪkt]:严格的。
strict:严格级别。字符编码有报错即抛出异常。也是默认级别,errors 参数值传入None 即按此级别抛出异常。
ignore [ɪɡˈnɔː]:忽视、忽略。
ignore:忽略级别。字符编号有错误,忽略掉。
推荐errors参数的取值为’ignore’,表示在遇到编码错误时忽略该错误,程序会继续执行,不会退出。
replace [rɪˈpleɪs]:替代。
replace:替换级别,字符编码有错的,替换成?。
4. mode参数
mode[məʊd]:模式。
mode 是可选参数。
参数mode决定了打开文件的模式。
r:以只读模式打开文件。
t:以文本文件模式打开文件。
b:以二进制文件文件模式打开文件。
w:以只写模式打开文件,不能读内容。如果文件不存在,则创建文件;如果文件存在,则覆盖文件的内容。
x:以独占创建模式打开文件,如果文件不存在,则创建并以写入模式打开;如果文件已存在,则引发FileExistsError异常。
a:以追加模式打开文件,不能读内容。如果文件不存在,则创建文件;如果文件存在,则在文件末尾追加。
+:以更新(读写)模式打开文件,必须与r、w或a组合使用,才能设置文件为读写模式。
这些字符可以进行组合,以表示不同类型的文件的打开模式,如下表所示。
【备注】上图来源于《看漫画学Python》。
【温馨提示】
参数 mode 可以不写,不写时mode默认值为r,即只读模式。
4. mode参数详解
1. 准备工作
-
我在D盘里新建一个文件夹命名为
69
。 -
我的
69
文件夹中有1个名为img
的文件夹,有1个名为69
的ipynb文件。(img文件夹是我存储图片用的,大家可以不用理会)
vscode编辑器资源管理器中的目录如下所示:
硬盘中的目录如下所示:
-
我的代码在名为
69
的ipynb文件中编写。 -
我用的vscode编辑器,编辑器打开的文件夹为
69
。
【备注】
编辑器打开的文件夹不同,则相对路径不同。
2. w 写入模式
w:以只写模式打开文件,不能读内容。如果文件不存在,则创建文件;如果文件存在,则覆盖文件的内容。
【语法解析】
-
文件不存在,则创建文件。
-
文件存在,则覆盖文件的内容。
以绝对路径,w只写模式打开文件:
f = open ("D:\\69\成绩1.txt", "w", encoding="utf-8")
以相对路径,w只写模式打开文件:
f = open ("成绩2.txt", "w", encoding="utf-8")
【代码解析】
f 是变量名,接收open 函数返回的文件对象;
"D:\\69\成绩1.txt"
是文件的绝对路径。
"成绩2.txt"
是文件的相对路径。
w
表示只写模式。
w 模式下,文件存在则打开文件,文件不存在则新建文件。
我们在准备工作时是没有新建过txt文件,因此成绩1.txt
和成绩2.txt
文件此时不存在。
不存在则新建一个文件。
因此,运行代码后我们观察资源管理器目录或者69文件夹,我们发现多了成绩1.txt
和成绩2.txt
2个文件。
这就是文件不存在则新建文件的意思。
【课堂练习】
修改路径参数,用绝对路径的方法在桌面新建一个名为测试.txt
的文件。
不知道桌面的绝对路径的可以用【shift】方法随便查看一个桌面文件的绝对路径。
下面就是我查看的桌面某个文件的路径:
“C:\Users\xiaoyuzhou\Desktop\空.docx”
参照上面的代码修改路径参数,代码如下:
f = open ("C:\Users\xiaoyuzhou\Desktop\测试.txt", "w", encoding="utf-8" )
【终端输出】
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
运行上面的代码,程序报错。
程序报错,我们首先考虑路径参数转义字符问题。
将路径参数中的所有\
都多加上一个反斜杠\
,修改如下:
f = open ("C:\\Users\\xiaoyuzhou\\Desktop\\测试.txt",
"w",
encoding="utf-8" )
运行代码后,我们发现程序能够正常运行。
我们查看电脑桌面,发现电脑桌面多了一个名为测试.txt
的文件。
但我们发现增加斜杆的方法实在太麻烦,那有没有其它简便的方法呢?
其实我们可以通过在路径参数前面加上一个字母r/R,这时候就不需要使用反斜杆进行转义了。
【路径参数前增加一个r】
f = open (r"C:\Users\xiaoyuzhou\Desktop\测试1.txt",
"w",
encoding="utf-8" )
【路径参数前增加一个R】
f = open (R"C:\Users\xiaoyuzhou\Desktop\测试2.txt",
"w",
encoding="utf-8" )
大家观察电脑桌面,我们就成功的新建了测试1.txt
和测试2.txt
2个文件。
我们继续讲解w模式的如果文件存在,则覆盖文件的内容。
我们刚才新建了成绩1.txt
和成绩2.txt
2个文件。
那如果文件存在,则w模式可以直接写入。
在成绩1.txt
中写入张三,90分
f = open ("成绩1.txt", "w", encoding="utf-8")
f.write("张三,90分")
f.close( )
上述代码的作用是将张三,90分
写入到文件成绩1.txt
中。
【代码解析】
f = open ("成绩1.txt", "w", encoding="utf-8")
f 是变量名,接收open函数返回的文件对象。
"成绩1.txt"
是open函数的file参数,表示文件的相对路径;
"w"
是open函数的mode参数,表示只写模式;
encoding表示字符编码格式为utf-8
。
f.write("张三,90分")
上述代码的作用是将张三,90分
写入到文件对象中,即写入到成绩1.txt
。
【将内容写入文件的语法】
f.write(obj)
f 是文件对象,就是一个变量名,你可以自己命名。
文件对象后紧跟一个英文小圆点.
write是方法名。
obj为要写入的内容,这里要写入的内容是张三,90分
运行代码后,大家查看成绩1.txt
文件,如下所示:
【关闭文件语法】
f.close( )
f 是变量名,接收open函数返回的文件对象。
文件对象后紧跟一个英文小圆点.
close是方法名。
【温馨提示】
大家在Python中操作文件时,注意读写完毕后都要进行关闭。这根我们日常生活中的操作是一样的,不关闭文件,我们是没办法对文件进行删除的。
上面代码我们完成了写入功能,下面我们讲解覆盖文件的内容的含义:
【覆盖文件的内容】
再执行下面的代码之前,大家先打开成绩1.txt
,确定文件里的内容为张三,90分
下面的代码要实现的功能是将李四,60分
写入文件成绩1.txt
:
f = open ("成绩1.txt", "w", encoding="utf-8")
f.write("李四,60分")
f.close()
运行上面的代码后,我们再观察成绩1.txt
文件,如下所示:
之前的张三,90分
内容被覆盖了,只保留了最后1次写入的内容,这就是覆盖文件内容的意思。
【知识回顾】
w:以只写模式打开文件,不能读内容。如果文件不存在,则创建文件;如果文件存在,则覆盖文件的内容。
那如果我不想删除文件本来就存在的内容,怎么办呢。
我们可以采用追加模式。
3. a 追加模式
a:以追加模式打开文件,不能读内容。如果文件不存在,则创建文件;如果文件存在,则在文件末尾追加。
a追加模式
和w只写模式
的区别在于追加模式保留原有内容,只写模式覆盖原有内容。
-
将mode参数修改为
a
-
写入内容为
王五,77分
f = open ("成绩1.txt", "a", encoding="utf-8")
f.write("王五,77分")
f.close()
打开成绩1.txt
,如下图所示:
打开成绩1.txt
可以看到王五,77分
已经写入到文件中,且原有的内容李四,60分
依然存在,这就是追加模式。
但大家发现我们写入的内容和原本的内容之间没有符号作为间隔,不方便我们观看。那该如何修改呢?
我们采用转义字符的方法可以解决上述问题。
\n
可以实现换行功能:
f = open ("成绩1.txt", "a", encoding="utf-8")
f.write("\n赵六,66分")
f.close()
输入后如下图所示:
【转义字符】
【备注】上图来源于《风变编程》。
4. r 只读模式
r:以只读模式打开文件。
只能打开已经存在的文件。
如果文件不存在,程序不会创建新的文件,会报错。
f = open ("成绩9.txt", "r", encoding="utf-8")
【终端输出】
FileNotFoundError: [Errno 2] No such file or directory: '成绩9.txt'
[Errno 2] No such file or directory: '成绩9.txt'
:没有这样的文件或目录: '成绩9.txt ’
f = open ("成绩1.txt", "r", encoding="utf-8")
f.close()
运行上述的代码,成绩1.txt文件其实已被我们成功打开。
但Python中的打开和我们日常生活中的打开不是一个含义。
我们工作中的打开,肉眼是可以看到一个具体的文档的。
Python中的打开,其实就是得到一个文件对象,方便我们后续操作文件,这个文件对象我们肉眼是看不见的。
有时候我们并不需要对文件进行写的操作,我们只需要打开文件即只读模式,此时我们的第二个参数mode 就为r
,注意,r
也可以不写。
mode 参数就讲解到这里,剩下的模式将不再进行赘述。
5. 总结
1. 代码总结
# w只写模式
f = open ("花名册.doc", "w", encoding="utf-8")
f.write("王小溪")
# a追加模式
f = open ("花名册.doc", "a", encoding="utf-8")
f.write("\n李华华")
# r只读模式
f = open ("花名册.doc", "r", encoding="utf-8")
# 关闭文件
f.close()
2. 路径的转义
绝对路径参数前面加上一个字母r/R,这时候就不需要使用反斜杆进行转义了。
3. mode模式
w:以只写模式打开文件,不能读内容。如果文件不存在,则创建文件;如果文件存在,则覆盖文件的内容。
a:以追加模式打开文件,不能读内容。如果文件不存在,则创建文件;如果文件存在,则在文件末尾追加。
r:以只读模式打开文件。
4. 图片总结
【温馨提示】
如果初学者在本节的代码遇到报错,基本是file路径参数的错误,建议大家回看相对路径
的相关知识,相对路径是非常重要的一个知识点,这个知识点不掌握,后面将寸步难行。