目录
1. open函数
2. file参数
3. mode参数
4. 多模式实操
4.1 'r'模式
4.2 'w'模式
4.3 'x'模式
4.4 'a'模式
4.5 '+'模式
4.6 'b'模式
4.7 't'模式
参考open函数
函数原型如下:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
file:指定一个将要打开的文件的路径(绝对路径或相对路径,参考绝对、相对路径 );可以是要封装文件对应的整数类型文件描述符(如果给出的是文件描述符,则当返回的 I/O 对象关闭时它也会关闭,除非将 closefd 设为 False 。)。
当 file 使用绝对路径时,按路径打开/新建相应文件;当 file 使用相对路径时,IDLE以Python安装文件夹为起始点,Pycharm以当前工程文件夹为起始点;
注意路径中的“\”会触发各类转义字符,可以参考原始字符串r"" 的处理方式如下:
f = open(r'E:\David\Code\python\文件\test2.txt','w')
f = open('E:\\David\\Code\\python\\文件\\test3.txt','w')
mode参数,可选参数,指定文件的打开模式,参数说明如下表:
字符串 |
含义 |
'r' |
读取(默认) |
'w' |
写入(如果文件已存在则先截断清空文件) |
'x' |
排他性创建文件(如果文件已存在则打开失败) |
'a' |
追加(如果文件已存在则在末尾追加内容),注1 |
'b' |
二进制模式,注2 |
't' |
文本模式(默认),注3 |
'+' |
更新文件(读取和写入) |
注1:在某些 Unix 系统中,无论当前文件指针位于什么位置,所有的写入操作都将追加到文件末尾。 |
mode参数,至少需要有'r'、'w'、'x'、'a'四种模式之一,并可视情况添加'+'模式,以及'b'、't'模式之一,譬如'r+'、'w+b'等。
默认模式为 'r' ,read模式(打开文件用于读取文本,与 'rt' 同义);
打开后,初始文件指针在位置0;
文件不存在时,'r' 模式打开文件失败,报错;
可以读取、修改文件指针,不可写入。
对如下文件做 'r' 模式打开:
# 'r' 模式打开文件test.txt,并赋值给f
f = open(r'E:\David\Code\python\文件\test.txt','r')
#文件可读、不可写、可修改指针
f.readable()
True
f.writable()
False
f.seekable()
True
#做文件读取、修改文件指针操作成功
f.readline()
'123abc *)-{\n'
f.seek(0)
0
f.read()
'123abc *)-{\n中国话,看一看……\n'
#做文件写入操作失败,报错
f.write('1234')
Traceback (most recent call last):
File "", line 1, in
io.UnsupportedOperation: not writable
#文件不存在时,'r' 模式打开文件失败,报错
f = open(r'D:\PycharmProject\测试文件\test4.txt','r')
Traceback (most recent call last):
File "", line 1, in
FileNotFoundError: [Errno 2] No such file or directory: 'D:\\PycharmProject\\测试文件\\test4.txt'
'w' 模式,write模式,如果文件不存在则新建文件,如果文件已存在则截断清空文件;
打开后,初始文件指针在位置0;
可以写入、修改文件指针,不可读取;
写入操作,自当前文件指针,替换/新增为待写入数据。
对4.1 'r' 模式操作文件 test.txt,做 'w' 模式打开,文件阶段清空,再做写入操作:
# 'w' 模式打开文件test.txt,并赋值给f2
f2 = open(r'E:\David\Code\python\文件\test.txt','w')
#可以写入、修改文件指针,不可读取
f2.readable()
False
f2.seekable()
True
f2.writable()
True
#对f2做写入、修改文件指针操作,成功
f2.write('1234')
4
f2.write('abcdefg')
7
f2.writelines('* ,\t. @\n#>')
f2.seek(3)
3
f2.write('中文')
2
#对f2做读取操作失败,报错
f2.read()
Traceback (most recent call last):
File "", line 1, in
io.UnsupportedOperation: not readable
#保存上述写入操作
f2.flush()
最终text.txt修改保存后如下:
'x' 模式,排他性创建文件,如果文件不存在创建空白文件,如果文件已存在则创建失败;
打开后,初始文件指针在位置0;
新创建的文件可以写入、修改文件指针,不可以读取;
写入操作,自当前文件指针,替换/新增为待写入数据。
#创建已存在文件失败,报错
f3 = open(r'E:\David\Code\python\文件\test.txt','x')
Traceback (most recent call last):
File "", line 1, in
FileExistsError: [Errno 17] File exists: 'E:\\David\\Code\\python\\文件\\test.txt'
# 'w' 模式创建文件test2.txt,并赋值给f3
f3 = open(r'E:\David\Code\python\文件\test2.txt','x')
#可以写入、修改文件指针,不可读取
f3.writable()
True
f3.readable()
False
f3.seekable()
True
#对f3做写入、修改文件指针操作,成功
f3.write('01234china中文\t¥,\n*#')
18
f3.seek(3)
3
f3.write('插入一段!')
5
#对f3做读取操作失败,报错
f3.read()
Traceback (most recent call last):
File "", line 1, in
io.UnsupportedOperation: not readable
#保存上述写入操作
f3.flush()
最终text2.txt修改保存后如下;因为调用指针插入中文,与文件中原有中文字符串位置交叉,导致部分数据混乱错误:
'a'模式,append(追加)模式,如果文件已存在则在末尾追加内容;
打开后,初始文件指针在位置 eof;
新创建的文件可以写入、修改文件指针,不可以读取;
写入操作,在文件末尾新增待写入数据。
# 'a' 模式创建文件test2.txt,并赋值给f
f = open(r'E:\David\Code\python\文件\test.txt','a')
#可以写入、修改文件指针,不可读取
f.writable()
True
f.readable()
False
f.seekable()
True
#对f做读取操作失败,报错
f.read()
Traceback (most recent call last):
File "", line 1, in
io.UnsupportedOperation: not readable
#对f做写入、修改文件指针操作成功
f.write('in a method')
11
f.flush()
f.seek(0)
0
f.write('cover')
5
#保存上述写入操作
f.flush()
所有写入数据,都自动在文件末尾添加:
'+' 模式,更新文件,同时支持读取和写入;
'+' 模式不能单独使用,需要配合 'r'、'w'模式一起使用;
'r+' 模式打开文件,但不清空内容,支持读取、写入、修改文件指针;
'w+'模式打开文件,清空内容,也支持读取、写入、修改文件指针。
#'+' 模式单独使用,打开文件失败,报错
f = open(r'E:\David\Code\python\文件\test.txt','+')
Traceback (most recent call last):
File "", line 1, in
ValueError: Must have exactly one of create/read/write/append mode and at most one plus
#'r+' 模式打开文件
f = open(r'E:\David\Code\python\文件\test.txt','r+')
#支持读取、写入、修改文件指针
f.writable()
True
f.readable()
True
f.seekable()
True
#读取、写入、修改文件指针,执行成功
f.read()
'0123abcd中文*&¥%'
f.write('替换ABCD')
6
f.seek(0)
0
f.read()
'0123abcd中文*&¥%替换ABCD'
#'w+' 模式打开文件
f2 = open(r'E:\David\Code\python\文件\test.txt','w+')
#文件清空,读取、写入、修改文件指针,执行成功
f2.read()
''
f2.write('123abc中文')
8
f2.seek(0)
0
'b'模式,以二进制模式打开的文件(包括 mode 参数中的 'b' )返回的内容为 bytes 对象,不进行任何解码;
不能单独使用,需要配合rwxa四种模式之一使用;
对以二进制模式打开的文件,写入数据需要转换为二进制格式。
# 'b' 模式不能单独使用,否则报错
f = open(r'E:\David\Code\python\文件\test.txt','b')
Traceback (most recent call last):
File "", line 1, in
ValueError: Must have exactly one of create/read/write/append mode and at most one plus
#文件读取返回二进制格式
f = open(r'E:\David\Code\python\文件\test.txt','r+b')
f.read()
b'123abc\xd6\xd0\xce\xc4in a methodcover'
#直接写入字符串数据,报错
f.write('abc')
Traceback (most recent call last):
File "", line 1, in
TypeError: a bytes-like object is required, not 'str'
#写入转换为二进制字节数据,成功
f.write(bytes('abcde',encoding="utf-8"))
5
f.seek(0)
0
f.read()
b'abcdec\xd6\xd0\xce\xc4in a methodcover'
修改后文件内容如下:
在文本模式下(默认情况下,或者在 mode 参数中包含 't' )时,文件内容返回为 str ,首先使用指定的 encoding (如果给定)或者使用平台默认的的字节编码解码;
不能单独使用,需要配合rwxa四种模式之一使用。
f = open(r'E:\David\Code\python\文件\test.txt','t')
Traceback (most recent call last):
File "", line 1, in
ValueError: Must have exactly one of create/read/write/append mode and at most one plus