Python之文件IO

一、文件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可选

二、缓冲区

**作用:**减少和磁盘的交互次数,提高磁盘读写效率

  1. buffer = 1 表示行缓存则在写入数据时遇到\n自动刷新缓冲区
  2. buffer = -1 采用系统默认缓存需要缓冲区满后才能自动写入磁盘
  3. 无论什么缓冲,当程序结束或文件被关闭时,都会将缓冲区内容写入磁盘
  4. 通过调用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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值