一、文件IO流程
创建文件对象 -> 进行文件操作 -> 关闭文件
1.创建文件对象
file = open(filename, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
- 返回值:区分二进制方式和文本方式;当以二进制方式打开一个文件时(mode参数后面跟’b’),返回一个未经解码的字节对象;当以文本方式打开时,返回一个按系统默认编码或参数encoding传入的编码来解码的字符串对象。
- mode指定文件的打开方式,默认rt(读文本方式)
- buffering指定读写文件的缓冲模式,0表示关闭缓冲区(仅在二进制方式打开时可用),1表示选择行缓冲(仅在文本方式打开时可用),大于1或为负数则表示使用系统默认提供的缓冲机制,系统默认的缓冲机制策略为:二进制文件使用固定大小的块缓冲区,文本文件使用行缓冲区。
mode参数及参数值说明:
值 | 说明 | 注意 |
---|---|---|
r | 以读文本方式打开 | 文件必须存在 |
rb | 以读二进制模式打开 | |
r+ | 以读写模式打开 | |
rb+ | 以二进制读写模式打开 | |
x | 创建一个新文件,以只写方式打开 | (python2不适用)文件必须不存在 |
w | 以写方式打开;文件不存在则创建,存在清空原有内容 | 文件存在,则将其覆盖,否则创建新文件用于写入 |
wb | 以二进制写模式打开 | |
w+ | 以读写模式打开文件;不存在则创建,存在清空原有内容 | |
wb+ | 以二进制读写模式打开 | |
a | 以追加模式打开 | 文件存在,则追加至文件末尾,否则创建新文件用于写入 |
ab | 以二进制追加模式打开 | |
a+ | 以读写追加模式打开 | |
ab+ | 以二进制读写追加模式打开 |
2.文件操作
1)读取文件
read([size])
功能: 用来直接读取文件中的全部内容,文件偏移量位于文件末尾
参数: 如果没有给定size参数(默认值为-1)或者size值为负,文件将被读取直至末尾,给定size最多读取给定数目个字符(文本方式)或字节(二进制方式)。
返回值: 返回读取到的全部内容
- 注意:文件过大时候不建议直接读取到文件结尾,读到文件结尾会返回空字符串。
readline([size])
功能: 用来读取文件中一行内容,文件偏移量位于第二行行首
参数: 如果没有给定size参数(默认值为-1)或者size值为负,表示读取一行,给定size表示最多读取指定的字符(字节)。
返回值: 返回读取到的内容
readlines([sizeint])
功能: 以行为单位读取文件中的每一行,存放在列表中
参数: 如果没有给定size参数(默认值为-1)或者size值为负,文件将被读取直至末尾,给定size表示读取到size字符所在行为止。
返回值: 返回读取到的行内容列表
文件对象本身也是一个可迭代对象,在for循环中可以迭代文件的每一行。
for line in f:
print(line)
2)写入文件
write(string)
功能: 把文本数据或二进制数据块的字符串写入到文件中去
参数:要写入的内容
- 如果需要换行要自己在写入内容中添加\n
writelines(str_list)
功能:接收一个字符串列表作为参数,将它们写入文件。如果需要换行,则需要加入每行的换行符
参数: 要写入的内容列表
3.关闭文件
打开一个文件后我们就可以通过文件对象对文件进行操作了,当操作结束后使用close()关闭这个对象可以防止一些误操作(读或写),也可以节省资源。
file.close()
4.其他方法/属性
file.readable() # 文件是否可读
file.writable() # 文件是否可写
file.closed # 文件是否关闭
file.encoding # 编码方式,若文件打开模式为b,则没有该属性
file.next() # 返回文件下一行
file.isatty() # 若文件连接到一个终端设备,则返回True,否则返回False
file.flush() # 立刻将文件内容从内存刷新到硬盘
file.truncate([size]) # 根据size参数截取文件,size可选
二、缓冲区
**作用:**减少和磁盘的交互次数,提高磁盘读写效率
- buffer = 1 表示行缓存则在写入数据时遇到\n自动刷新缓冲区
- buffer = -1 采用系统默认缓存需要缓冲区满后才能自动写入磁盘
- 无论什么缓冲,当程序结束或文件被关闭时,都会将缓冲区内容写入磁盘
- 通过调用flush()可以人为刷新缓冲
fd = open("test", "w", 12)
while True:
mark = 0
s = input(">>")
fd.write(s + '\n') # 行缓冲,遇到换行符和磁盘进行交互
fd.flush() # 立即刷新缓冲区,将内容写入磁盘
if mark >= 15:
break
fd.close()
三、with语句
1.应用场景:
python中的with语句适用于对资源进行访问的场合,保证不管处理过程中是否发生错误或者异常都会执行规定的“清理”操作,释放被访问的资源,应用场景有文件读写后自动关闭、线程中锁的自动获取和释放(threading.Lock)等。
用于文件读写时,可以及时关闭系统级文件,避免资源占用,可以自动关闭文件和处理异常
with expression [as target]:
with-body
2.上下文管理器
概念:是一个简单“协议”或接口,自定义对象需要遵循这个接口来支持with语句。总之,若想将一个对象作为上下文管理器,需要做的就是向其中添加__enter__和__exit__方法,Python将在资源管理周期的适当时间调动这两种方法。
class ManagedFile:
def __init__(self, name):
self.name = name
def __enter__(self):
self.file = open(self.name, 'w')
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
if self.file:
self.file.close()
with ManagedFile("With_express.txt") as f:
f.write("hello Python!\n")
f.write("bye-bye~")
# 当执行流程进入with语句上下文时,Python会调用__enter__获取资源;
# 离开with上下文时,Python会调用__exit__释放资源。
四、文件偏移量与文件描述符
1.文件偏移量
功能:代表文件的当前读写操作位置,随读写操作移动,可形象地理解为光标
1.r,w方式打开文件,此时偏移量在开头
2.以a方式打开文件,此时偏移量在末尾
2.文件描述符(file descriptor)
概念:是系统为每个IO操作分配的整数, 不会重复,可以用在os模块的read方法等一些底层操作上
获取文件描述符:file.fileno()
通过IO对象获取对应的文件描述符
3.基本操作
tell()
功能:获取文件偏移量大小,即文件对象的“光标”当前所处的位置,它是是从文件开头开始算起的字节数
seek(offset[,whence])
功能:移动文件偏移量位置
参数:offset 代表相对于某个位置移动的字节数,即以bytes为单位移动。负数表示向前移动,正数表示向后移动。
whence是基准位置,默认值为 0,代表从文件开头算起,1代表从当前位置算起,2 代表从文件末尾算起。
示例(x>0):
seek(x, 0) 表示从文件的开头位置向后移动x个字符
seek(x, 1) 表示从文件的当前位置向后移动x个字符
seek(-x, 2)表示从文件的结尾位置向前移动x个字符
- 注:在文本文件中,没有使用b模式选项打开的文件,只允许从文件头开始计算相对位置,从文件尾计算时就会引发异常io.UnsupportedOperation