语法:
代码语言:javascript复制open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)
示例
创建一个文件est,然后打开它,用完之后关闭。
代码语言:javascript复制In [1]: f = open("test")
In [2]: f
Out[2]: <_io.TextIOWrapper name='test' mode='r' encoding='UTF-8'>
In [3]: print(f.read())
In [4]: f.close()
文件操作中,最常用的操作就是读和写; 文件访问的模式有昂中:文本模式和二进制模式。不同模式下,操作函数不尽相同,表现的结果也不一样。
参数
file:打开或者要创建的文件名,如果不指定路径的话,默认就是当前路径。 mode模式:
描述字符 | 意义 |
---|---|
r | read,缺省的,表示只读打开 |
w | write,只写打开,文件不存在会创建,文件存在会清空内容 |
x | 创建并写入一个新的文件 |
a | append,写入打开,如果文件存在则追加 |
b | byter,二进制模式 |
t | text,缺省的,文本模式 |
| 读写打开一个文件,给俺来只读、只写方式打开提供缺失的读或写能力 |
上述示例中,可以看到mode是没有写的,所以可以看到默认就是用文本打开的并且是只读。
r模式
r模式是只读打开文件,如果使用write方法,就会抛出异常。如果文件不存在。则抛出FileNotFoundError异常。
代码语言:javascript复制In [5]: f = open("test") # 默认是只读
In [6]: f.read()
Out[6]: ''
In [7]: f.write('abc') # 只读模式是不能写的
---------------------------------------------------------------------------
UnsupportedOperation Traceback (most recent call last)
<ipython-input-7-3626d6c87fee> in <module>
----> 1 f.write('abc')
UnsupportedOperation: not writable
In [8]: f.close()
In [9]: f = open("test",'r') # 加上r模式,只读
In [10]: f.write('acss') # r模式下是不能写的
---------------------------------------------------------------------------
UnsupportedOperation Traceback (most recent call last)
<ipython-input-10-458819baaf89> in <module>
----> 1 f.write('acss')
UnsupportedOperation: not writable
In [11]: f.close()
In [12]: f = open("test1",'r') # r模式下文件不存在会报错的
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-12-d7916e348a93> in <module>
----> 1 f = open("test1",'r')
FileNotFoundError: [Errno 2] No such file or directory: 'test1'
w模式
w 模式表示只写方式打开文件,如果读取则会抛出异常;如果文件不存则则直接创建文件;如果文件存在,则清空文件内容。
代码语言:javascript复制In [1]: f = open('test','w') # 以只写的方式打开test文件,文件不存在就创建,存在就清空。
In [2]: f.write('accc') # 调用write方法写入
Out[2]: 4
In [3]: f.close() # 关闭文件
In [4]: cat test # 查看test文件内容,已经写入进去
accc
In [5]: f = open('test',mode='w') # 以只写的方式打开test文件,文件已经存在并且有内容
In [6]: f.close() # 什么也不干,直接关闭
In [7]: cat test # 查看文件,内容已经被清空了
In [8]: f = open('test1',mode='w')
In [9]: f.write('123')
Out[9]: 3
In [10]: f.close()
In [11]: cat test1
123
x模式
x 模式文件不存在,就创建文件,并且以只写方式打开;若文件存在,则抛出FileExistsError异常。
代码语言:javascript复制In [12]: f = open('test2','x') # 以x方式打开test2文件,不存在就创建,以只写方式打开
In [13]: f.read() # 读取报错
---------------------------------------------------------------------------
UnsupportedOperation Traceback (most recent call last)
<ipython-input-13-571e9fb02258> in <module>
----> 1 f.read()
UnsupportedOperation: not readable
In [14]: f.write('abdc') # 写入正常
Out[14]: 4
In [15]: f.close()
In [16]: cat test2
abdc
In [17]: f = open('test2','x') # test2文件已存在,以x模式打开报错
---------------------------------------------------------------------------
FileExistsError Traceback (most recent call last)
<ipython-input-17-ba6940455994> in <module>
----> 1 f = open('test2','x')
FileExistsError: [Errno 17] File exists: 'test2'
a模式
a模式文件存在,以只写模式打开,追加内容;文件不存在,则创建后以只写模式打开,追加内容。
代码语言:javascript复制In [18]: f = open('test2','a') # 以a模式打开test2文件
In [19]: f.read() # 读取是报错的
---------------------------------------------------------------------------
UnsupportedOperation Traceback (most recent call last)
<ipython-input-19-571e9fb02258> in <module>
----> 1 f.read()
UnsupportedOperation: not readable
In [20]: f.write('accccc') # 追加写入
Out[20]: 6
In [21]: f.close()
In [22]: cat test2 # 查看test2文件
abdcaccccc
In [23]: f = open('test2','a')
In [24]: f.write('n hello')
Out[24]: 7
In [25]: f.close()
In [26]: cat test2
abdcaccccc
hello
In [27]: f = open('test3','a') # 以a模式打开test3文件,文件不存在,则创建
In [28]: f.write('test3') # 写入正常
Out[28]: 5
In [29]: f.close()
r模式是只读,wxa模式都是只写。wxa都可以产生新的文件,w模式不管文件存在与否,都会生成全新内容的文件;a模式不管文件是否存在,都能在打开的文件尾部追加;x必须要求文件事先不存在,自己会创建一个新的。
t模式
t模式,顾名思义就是text。字符流,将文件的字节按照某种字符编码理解,按照字符操作。open默认的mode就是rt。
代码语言:javascript复制In [30]: f = open('test')
In [31]: f
Out[31]: <_io.TextIOWrapper name='test' mode='r' encoding='UTF-8'>
b模式
b模式,字节流(bytes),将文件按照字节理解,与字符编码无关。二进制模式操作时,字节操作使用bytes类型。
代码语言:javascript复制In [33]: f = open('test','rb')
In [34]: f
Out[34]: <_io.BufferedReader name='test'>
In [36]: cat test2
abdcaccccc
hello
In [37]: f = open('test2','rb')
In [38]: s = f.read()
In [39]: print(type(s))
<class 'bytes'>
In [40]: f.close()
In [41]: f = open('test3','wb')
In [42]: s = f.write(b"abcde")
In [43]: print(s)
5
In [44]: s = f.write('连仕彤博客'.encode())
In [45]: print(s)
15
In [46]: f.close()
模式
模式为r、w、a、x提供确实的读写功能,但是获取文件对象依旧按照r、w、a、x自己的特征; 不能单独使用,可以理解为它是为前面的模式字符做增强功能的。