操作文件时,一般需要:
- 打开文件
- 操作文件
一、打开文件:open(file[,mode=r])
- open() 函数用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
- open() 函数常用形式是接收两个参数:文件名(file)和模式(mode),即文件路径file和以mode方式打开文件。
注意: 使用 open() 函数一定要保证关闭文件对象,即调用 close() 函数。
打开文件的模式
mode | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
可读模式r
//log.txt可读模式下不存在会报错。
f = open('log.txt' , 'r')
f.close()
可写模式w
//没有log.txt运行后会自动创建log.txt文件
f = open('log.txt' , 'w')
f.close()
追加模式a
//没有log.txt运行后会自动创建log.txt文件
f = open('log.txt','a')
f.close()
刚开始没有log.txt文件,运行后出现log.txt文件
二、 操作
f = open('log.txt','r')
data = f.read() #读文件
f.close() #关闭文件
上面代码存在的问题:如果在读写时出现异常忘了异常处理,不会执行到关闭方法;有可能写代码忘了写f.close()语句
解决:
- 一般使用try catch finally语句处理,以避免因读取文件时异常的发生而没有关闭问题的处理
f = open('log.txt','r')
try:
data = f.read() #读文件
finally:
f.close()
- 上面解决方法代码太长,可以使用with(上下文管理)更优雅的方法,with还可以很好的处理上下文环境产生的异常,可以避免忘记写关闭方法。
with open('log.txt','r') as f:
data = f.read()
运行说明:with后面接的对象返回的结果赋值给f。此例当中open函数返回的文件对象赋值给了f;with会自已获取上下文件的异常信息。
三、上下文管理,with如何工作?
-
with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。
-
紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。
运行流程:
- _enter_()方法被执行
- _enter_()方法返回的值,赋值给变量f
- 执行代码块,f.read()的值赋值给变量data
- _exit_()方法被调用