Python — 文件IO常用操作(一)– open参数 mode
一、打开操作
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
打开一个文件,返回一个文件对象(流对象)和文件描述符。
打开文件失败,则返回异常。
基本使用:创建一个文件test,然后打开它,用完关闭
f = open("test") # file对象 # windows <_io.TextIOWrapper name='test' mode='r' encoding='cp936'> # linux <_io.TextIOWrapper name='test' mode='r' encoding='UTF-8'> print(f.read()) # 读取文件 f.close() # 关闭文件
文件操作中,最常用的操作就是读和写。
文件访问的模式有两种:文本模式和二进制模式。
不同模式下,操作函数不尽相同,表现得结果也不一样。
注:
Windows中使用codepage代码页,可以认为每一个代码页就是一张编码表。cp936等同于GBK。
二、open的参数
1、file
打开或者要创建的文件名。
如果不指定路径,默认是当前路径。
2、mode模式
默认是文本打开模式,且是只读的。
(1) r模式
文件指针初始在开头0
# r模式 只读,默认打开模式;文件不存在,立即报错 f = open('test') # 只读还是只写? ----只读,默认是文本打开模式,且是只读的 f.read() f.write('abc') f.close() f = open('test', 'r') # 只读 f.write('abc') f.close() f = open('test1', 'r') # 只读,文件不存在
(2) w模式
文件指针初始位置在0
# w模式 ''' w模式,为白纸一张,从头写 1. 只写,不支持读取 2. 文件存在,文件内容将被清空,从头写,小心:会清空内容 3. 文件不存在,文件将被创建,从头写 ''' f = open('test', 'w') # 只写打开 f.write('abc') f.close() f = open('test', mode='w') f.close() f = open('test1', mode='w') f.write('123') f.close()
(3) a模式
文件指针初始位置在EOF
# a模式 ''' 只写,不支持读取 文件存在,追加写入 文件不存在,创建文件,从头写,对于白纸来说就是从尾部写,也就是追加写 a模式,不管文件存在否,都从尾部追加写入 所以: 文件存在,只写打开,追加内容 文件不存在,则创建后,只写打开,追加内容 ''' f = open('test2', 'a') f.read() f.write('abcde') f.close() f = open('test2', 'a') f.write('\n hello') f.close() f = open('test3', 'a') f.write('test3') f.close()
(4) x模式
文件指针在初始位置0
# x模式 exists ''' 只写,不支持读取 文件存在,抛异常 -- 文件存在了 文件不存在,创建新文件,所以只能从头写 所以: 文件不存在,创建文件,并只写方式打开 文件存在,抛出FileExistsError异常 ''' f = open('test2', 'x') f.read() f.write('abcd') f.close() f = open('test2', 'x')
总结:
open默认是只读模式 r 打开已经存在的文件
r模式:
只读打开文件,如果使用write方法,会抛异常
如果文件不存在,抛出FileNotFoundError异常
w模式:
表示只写方式打开,如果读取则抛出异常
如果文件不存在,则直接创建文件
如果文件存在,则清空文件内容
r是只读,wxa都是只写
wxa模式都可以产生新文件:
w不管文件是否存在,都会产生全新内容的文件重新写入
a不管文件是否存在,都能在打开的文件尾部追加
x必须要求文件事先不存在,自己要造一个新文件
w从头写;a追加写;x文件不存在,创造文件从头写
字符和编码有关,字符串的世界都是有编码的
(5) mode中的t,文本模式
字符流,将文件的字节按照某种字符编码理解,按照字符操作。
t是text,文本模式,默认可以不写
t模式不能单独使用,必须和rwax四种之一配合使用,不影响主模式
open的默认mode就是rt(rt才是真正的默认模式)
(6) 二进制模式b
b是binary,二进制,字节的世界都是0和1组成的字节,和编码无关
字节流,将文件就按照字节理解,与字符编码无关
二进制模式操作时,字节操作使用bytes类型
f = open("test3", 'rb') # 二进制只读 s = f.read() print(type(s)) # bytes print(s) f.close() # 关闭文件 f = open("test3", 'wb') # IO对象 s = f.write("你好".encode()) print(s) # 是什么? f.close()
四种主模式rwax只能选择一种,与t 、b组合使用
(7) +
为r、w、a、x提供缺失的读或写功能,但是,获取文件对象依旧按照r、w、a、x自己的特征
+模式不能单独使用,可以任务它是为前面的模式字符做增强功能的
+的意思是plus,附加的能力,必须和主模式配合使用,不影响主模式
r+, rt+, r+t 只读文本模式打开,补充写能力
w+,wt+,w+t 只写文本模式打开,补充读能力,w能力不变
三、文件指针
文件指针,指向当前字节位置
mode=r,指针起始在0
mode=a,指针起始在EOF
tell()显示指针当前位置,返回的一直都是字节的索引
seek(offset[, whence])
移动文件指针位置,offset偏移多少字节,whence从哪里开始
文本模式下
whence 0 缺省值,表示从头开始,offset只能正整数
whence 1 表示从当前位置,offset只接受0
whence 2 表示从EOF开始,offset只接受0
文本模式支持从开头向后偏移的方式
whence为1表示从当前位置开始偏移,但是只支持偏移0,相当于原地不动,所以没什么用
whence为2表示从EOF开始,只支持偏移0,相当于移动文件指针到EOF
seek是按照字节偏移的
read在文本模式是按照字符读取的
二进制模式下:
whence 0 缺省值,表示从头开始,offset只能正整数
whence 1 表示从当前位置,offset可正可负
whence 2 表示从EOF开始,offset可正可负
二进制模式支持任意起点的偏移,从头、从尾、从中间位置开始
向后seek可以超界,但是向前seek的时候,不能超界,否则抛异常
作者:晶晶亮_Casablanca