1、open函数用来打开文件
open(name[.mode[.buffering]])
只有文件名是需要输入的强制参数,然后返回一个文件对象,模式默认是读模式,默认缓冲区是无;
例如:正常打开:
In [2]: f = open('ceshi.txt')
In [3]:
如果你要打开的文件不存在的话,会报错如下:
In [3]: f = open('ceshi_jier.txt')
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-3-69dfda19266b> in <module>
----> 1 f = open('ceshi_jier.txt')
FileNotFoundError: [Errno 2] No such file or directory: 'ceshi_jier.txt'
In [4]:
2、文件模式
值 | 功能描述 |
‘r’ | 读模式 |
‘w’ | 写模式 |
‘a’ | 追加模式 |
‘b’ | 二进制模式(可以添加到其他模式中使用) |
‘+’ |
读/写模式(可以添加到其他模式中使用) |
‘b’模式一般处理文本文件用不到,一般是处理二进制和媒体文件的时候用到;
3、文件缓冲区
open函数中第三个可选参数buffering控制着文件的缓冲,如果参数是0,I/O操作就是无缓冲的,直接将数据写到了硬盘上,如果参数是1,就是有缓冲,先写到内存,只有使用flush和close函数,才会将数据写到硬盘里;如果参数是1,就表示缓冲区是1字节,任何负数都代表使用默认缓冲区大小,即缓冲为0;
4、文件读取
文件读取主要是分为按字节读取和按行进行读取,经常用到的方法有read()、reablines()、close()。
read方法,读取文件全部信息出来;
In [8]: f = open('ceshi.txt')
In [9]: f.read()
Out[9]: 'my name is jier!\nhow are you?\n'
In [10]: f.close()
每次打开文件,一定要记得关闭,因为文件对象会占用操作系统资源,影响系统的IO操作;
由于文件操作可能出现IO异常,一旦出现IO异常的话,后面的close方法就不会执行了,为了程序的健壮性,我们使用try...finally来实现。
In [11]: try:
...: f= open('ceshi.txt')
...: print(f.read())
...: finally:
...: if f:
...: f.close()
...:
my name is jier!
how are you?
In [12]:
还有另外一种方法可以简略上面的写法,那就是with语句来代替try...finally代码块和close方法:
In [12]: with open('ceshi.txt', 'r') as jier:
...: print(jier.read())
...:
my name is jier!
how are you?
In [13]:
调用read()可以一次将文件内容读入内存中,但是如果文件过大的话,就是出现内存不足的问题,一般对于大文件,我们一般使用分段读取,即read(size)方法,一次最多读取size个字节。如果文件是文本文件,我们可以调用readline()每次读取一行内容,调用readlines()一次读取所有内容并按行返回列表。
上面的代码,可以使用readlines实现:
In [13]: with open('ceshi.txt', 'r') as jier:
...: for line in jier.readlines():
...: print(line.strip())
...:
my name is jier!
how are you?
In [14]:
5、文件写入
写文件和读文件是一样的,唯一的区别是在调用open方法时,传入标识符'w'或者‘wb’表示写入文本文件或者写入二进制文件,示例如下:
In [14]: f = open('ceshi.txt', 'w')
In [15]: f.write('ceshi111')
Out[15]: 8
In [16]: f.write('ceshi222')
Out[16]: 8
In [17]: f.close()
In [18]: with open('ceshi.txt', 'r') as jier:
...: for line in jier.readlines():
...: print(line.strip())
...:
ceshi111ceshi222
In [19]:
但是有一个问题,就是说如果是这样的话,就会把原来文件中的内容给覆盖了,这个时候我们就可以将open的模式改为‘a’:
In [31]: f = open('ceshi.txt', 'a')
In [32]: f.write('ceshi3333')
Out[32]: 9
In [33]: f.close()
In [35]: with open('ceshi.txt', 'r') as jier:
...: for line in jier.readlines():
...: print(line)
...:
ceshi111ceshi222ceshi3333
In [36]:
我们可以反复调用write()方法写入文件,最后必须使用close()方法关闭文件。使用write()的方法的时候,操作系统是不会直接写入文件中的,而是先写入内存中缓存起来,等到空闲时候再写入文件中,最后使用close()就可以写入文件中了,如果中途想写入文件,执行其他操作的话,也可以使用flush()来刷新,不断将内存中的缓存写入文件。
以上代码也可以使用with来执行:
In [36]: with open('ceshi.txt', 'a') as jier:
...: jier.write('/tnihao')
...: jier.close()
...:
In [37]: with open('ceshi.txt', 'r') as jier:
...: for line in jier.readlines():
...: print(line)
...:
ceshi111ceshi222ceshi3333/tnihao