open 打开
read 读取
write 写入
close 关闭
readline 行读取
readlines 多行读取
seek 文件指针操作
tell 指针的位置
open(file, mode = 'r', buffering = -1, encoding = None, errors = None, newline = None, closefd = True,opener = None)
file : 文件名称或者是文件路径
mode : 文件模式
buffering : 缓冲区
encoding : 编码模式,utf-8 编码,Gbk 编码
打开一个文件,返回一个文件对象(流对象)和文件描述符。打开文件失败,则返回异常
创建一个文件test,然后打开它,用完###关闭###
f = open('test') # file 对象
print(f.read()) # 读取文件
f.close() # 关闭文件
在上条语句中 打开test文件,mode 为默认的'rt'模式
文件操作中,最常用的操作就是读和写
文件访问的模式有两种 : 文本模式和二进制模式。不同模式下,操作函数不尽相同,表现得结果也不一样
打开或者要创建的文件名。如果不指定路径,默认是当前路径
描述字符 意义
r 缺省的,表示只读打开
w 只写打开
x 创建并写入一个新文件
a 写入打开,如果文件存在,则追加
b 二进制模式 ,不能单独使用
t 缺省的,文本模式,不能单独使用
+ 读写打开一个文件。给原来只读、只写的方式打开提供缺失的读或者写的能力,不能单独使用
在上面例子中,可以看到默认是文本打开模式,且是只读的
open 默认是只读模式r打开已经存在的文件
r 模式
只读打开文件,如果使用write方法会抛异常
如果文件不存在,则会抛出 FileFoundErroor异常
w 模式
表示只写方式打开,如果读取则抛异常
如果文件不存在,则直接创建文件
如果文件存在,则清空文件内容
x 模式
文件不存在,创建文件,并只写方式打开
文件存在,则抛出FileExistsError
a 模式
文件存在,只写打开,追加内容
文件不存在,则创建后,只写打开,追加内容
r 是只读,wxa都是只写
wxa 模式都可以产生新文件
w 不管文件存在与否,都会产生全新内容的文件
a 不管文件是否存在,都能在打开文件尾部追加
x 必须要求文件实现不存在,自己要造一个新文件
t 模式
按照字符模式操作
b 模式
与字符编码无关。二进制模式操作,与字符编码无关 ,bytes类型
+ 模式
为 r,w,a,x提供缺失的读或者写的功能,但是获取文件对象依旧按照r,w,a,x 自己的特征
+ 模式不能单独使用,可以认为它是为前面的模式字符做增强功能的
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 的时候,不能超界,否则抛异常
-1 表示使用缺省值大小的buffer,如果是二进制模式,使用io.DEFAULT_BUFFER_SIZE值,
默认是4096或者8192.
如果是文本模式,如果是终端设备,是行缓存方式,如果不是,则使用二进制模式的策略
0 只在二进制模式使用,表示关buffer
1 只在文本模式使用,表示使用行缓冲,意思就是见到换行符就是flush
大于1,用于指定buffer的大小
缓冲一个内存空间,一般来说是一个FIFO队列,到缓冲区满了或者到达阈值,数据才会flush到磁盘
flush() 将缓冲区写入磁盘
close() 关闭前会调用flush()
io.DEFAULT_BUFFER_SIZE 缺省缓冲区大小,字节
buffering = 0
这是一种特殊的二进制模式,不需要内存的buffer,可以看做是一个FIFO的文件
buffering 说明
buffering = -1 t和b,都是io.DEFAULT_BUFFER_SIZE
buffering = 0 b 关闭缓冲区
t 不支持
buffering = 1 t 行缓冲,遇到换行符才flush
buffering > 1 b模式表示缓冲大小。缓冲区的值可以超过io.DEFAULT_BUFFER_SIZE,直到设定的值
超出去才把缓冲区flush。
t模式,是io.DEFAULT_BUFFER_SIZE字节,flush完后把当前字符也写入磁盘
None 表示使用缺省编码,依赖操作系统
Windows下缺省GBK,Linux下缺省UTF-8
None和strict表示有编码错误将抛出ValueError异常:ignore 表示忽略
文本模式中换行的转换可以为None,“空串”,’\r’,’\n’,’\r\n’
读时None表示’\r’,’\n’,’\r\n’都被转换成’\n’:表示不会转换成通用换行符:其他合法字符表示换行符就是指定字符,就会按照指定字符分行
写时,None表示’\n’都会被替换为系统缺省行分隔符 os.linesep :’\n’或者表示’\n’不替换:其他合法字符表示’\n’
会被替换为指定的字符
关闭文件描述符,True表示关闭它。False会在文件关闭后保持这个描述符。filebj.fileno()
read(size = -1)
size 表示读取多少个字节或字符:负数或者None表示读取到EOF
readline(size = -1)
一行行读取文件内容。size设置一次能读取行内几个字节或字符
readlines(hint = -1)
读取所有行的列表。指定hint则返回指定的行数
write(s),把字符串f写入到文件中并返回字符的个数
writelines(lines),将字符串列表写入文件
flush 并关闭文件对象
文件已经关闭,再次关闭没有任何效果
名称 说明
seekable() 是否可seek
readable() 是否可read
writeable() 是否可写
closed 是否已经关闭
with open(‘test’) as f :
print(f,f.closed)
f.write(‘abc’)
文件只读写入失败,但是可以关闭
f1 = open(‘test’)
with f1:
f1.write(‘ancd’)
文件只读写入失败,但是可以关闭
上下文管理
1.使用 with…as 关键字
2.上下文管理的语句块并不会开启新的作用域
3.with 语句块执行的时候,会自动关闭文件对象
1.对于类似于文件对象的IO对象,一般来说都需要在不是用的时候关闭、注销,已释放资源
2. IO被打开的时候,会获得一个文件描述符。计算机资源有限的,所以操作系统会做限制,
就是为了保护计算机资源不要被完全耗尽,计算机资源是共享的不独占的。
3.一般情况下除非明确的知道当前资源情况,否则不要盲目的提高资源化的限制来解决问题