Python可使用open函数来实现文件的打开,关闭,读写操做;python
Python3中的open函数定义为:json
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
其中mode列表为:app
'r' #open for reading (default) 'w' #open for writing, truncating the file first 'x' #create a new file and open it for writing,python3新增 'a' #open for writing, appending to the end of the file if it exists 'b' #binary mode 't' #text mode (default),python3新增 '+' #open a disk file for updating (reading and writing) 'U' #universal newline mode (deprecated)
这里咱们主要关心一下'r', 'w', 'a', 'r+', 'w+', 'a+', 'x',不少人容易混淆不一样模式的读写操做ide
1)'r'函数
只读模式,open函数中mode参数的默认模式,文件不存在的话,报FileNotFoundError(python2是IOError);ui
文件打开后,初始游标位置为0;spa
每次读都是从游标位置开始读;3d
若是进行了写操做,会报以下异常:code
io.UnsupportedOperation: not writable
2)'w'blog
只写模式,文件不存在的话,建立文件;文件存在的话,首先清空文件,而后开始写;
文件打开后,初始游标位置为0;
每次写都是从游标位置开始写;
若是进行了读操做,首先文件也会被清空,会报以下异常:
io.UnsupportedOperation: not readable
3)‘a’
追加模式,文件不存在话,建立文件;文件存在的话,不会清空文件;
文件打开后,初始游标位置为文件结尾;
每次写都是从结尾开始写;
若是进行了读操做,同时报以下异常:
io.UnsupportedOperation: not readable
上面的比较好理解,下面就有点绕了
4)'r+'
读写模式,文件不存在的话,报FileNotFoundError(python2是IOError);
文件打开后,初始游标位置为0;
每次读写都是从游标位置开始;可是对于写操做,相似于替换操做;
看以下代码:
文件内容为:
abcdefg
代码内容为:
f = open('open_mode.txt', 'r+') f.write('xyz') f.close()
运行代码后,文件内容变为:
xyzdefg
5)'w+'
只写模式,文件不存在的话,建立文件;文件存在的话,首先清空文件;
文件打开后,初始游标位置为0;
每次读写都是从游标位置开始;写操做,相似于替换操做;
6)‘a+’
追加模式,文件不存在话,建立文件;文件存在的话,不会清空文件;
文件打开后,初始游标位置为文件结尾;
每次写都是从结尾开始写;
读操做从游标位置开始;
7) 'x'
python3新加
建立文件并写操做,操做必须是不存在的文件,若是操做的文件已存在,则报错FileExistsError
不可读,若是进行了读操做,同时报以下异常:
io.UnsupportedOperation: not readable
最后画一张表格总结一下:
8)'b'
二进制形式读写文件;
写数据时,写入的数据类型必须为字符串类型,其余类型必须经过json(就是符合json格式的字符串)写入
python2与python3对于'b’ mode的行为不一样,这和python2与python3的字符串类型有关;事实上,python的字符串类型有两种;
Python2的两种字符串类型,分别叫作str和Unicode,str实例包含原始的8位值;而unicode的实例,则包含Unicode字符。
Python2的两种字符串类型,分别叫作byte和str,与python2不一样的是,byte实例包含原始的8位值;而str的实例,则包含Unicode字符。
当读写文件采用'b'的模式时,要求必须以二进制形式读写,在python2中,字符串必须为str字符串,python3中必须为byte字符串;因此在python3,'b'模式下这样读写字符串
s = b'hello world!' #注意是byte字符串 f = open('open_mode.txt','wb') f.write(s)
或:
s = 'hello world!' f = open('open_mode.txt','wb') f.write(s.encode(encoding='utf-8'))
否则会报以下错误:
Traceback (most recent call last): File "C:/Users/Desktop/Python/cnblogs/数据类型.py", line 125, in <module> f.write(s) TypeError: a bytes-like object is required, not 'str'
open的内容还有不少,针对于读,还有个更好的模块linecache用于读取大文件;之后有时间继续扩展