沧海为霜

作者:方新运

python的io模块实现了多种形式的I/O类,该模块所解决的中心问题是无缝的处理不同形式的基本I/O。例如,由于换行与字符编码相关的问题,处理文本与处理二进制数据略有不同。为了处理这些差异,此模块由一系列代码层组成,其中每层依次增加更多功能。

一、基本I/O接口

io模块顶一个所有类文件对象都会实现的基本I/O编程接口。此接口由基类IOBase定义。IOBase的实例f支持以下基本操作

属性 描述
f.closed() 指示文件是否关闭的标志
f.close() 关闭文件
f.fileno() 返回整数形式的文件描述符
f.flush() 清空I/O缓存
f.isatty() 如果f是终端,则返回True
f.readable() 如果f已打开,则返回True
f.readline([limit]) 从流中读取一行。limit是要读取字节的最大数量
f.readlines([limit]) 读取f的所有行,然后以列表形式返回。如果提供limit参数,它表示在停止之前能够读取字节的最大数量。实际读取的字节数将稍大以容纳保持原样的最后一行
f.seek(offset, [whence]) 移动文件指针到相对于whence中指定位置的新位置。offset代表字节数。whence是0代表文件开始位置,1代表当前位置,2代表文件结尾
f.seekable() 如果f是可推动的则返回True
f.tell() 返回文件指针的当前值
f.truncate([size]) 将文件截取为size指定大小的字节。如果未指定size参数,它将把文件截取为0个字节
f.writable() 如果f已打开并可写入,则返回True
f.writelines(lines) 将一系列行写入f。不额外添加行尾,因为它们已经是每行的组成部分。

二、原始I/O

I/O系统的最低层次与涉及原始字节的I/O相关。这个层次的核心对象是FileIO,它提供了向低级别系统调用(如read()和write())的直接接口。
FileIO(name,[,mode [,closefd]])
此类用于在文件或者系统文件描述符上执行原始的低级别I/O操作。name是由os.open()函数或者其它文件对象的fileno()方法返回的文件名或者整数文件描述符。mode的值可以包含'r'(默认值)、'w'或者'a',分别代表读取写入和附加。mode还可以加入'+'代表更新,同时支持读取和写入。closefd是一个标志,用于确定close()是否关闭了底层文件,默认情况下它的它的值为True,但如果使用FileIO给已经在其他地方打开的文件加上包装,那么他的值将被设置为False。如果制订了文件名,就会直接调用操作系统用的open()打开作为结果得到的文件对象。不存在内部缓存,而且所有数据都将作为原始字节字符串进行处理。FileIO实例f具有前面描述过的所有基本I/O操作,再加上一下属性和方法。

属性 描述
f.closefd() 一个标志用于确定底层文件是否由f.close()方法(只读)关闭
f.mode 打开时使用的文件模式(只读)
f.name 文件名(只读)
f.read([size]) 使用一次系统调用读取的最大字节数。如果忽略size参数,就会使用f.readall()方法返回尽可能多的数据。这种操作返回的数据可能比请求的要少,因此必须使用len函数进行检查。如果非锁定模式中不存在可用数据,则返回None
f.readall() 读取尽可能多的数据,并以一个字节字符串的形式返回。遇到EOF时返回一个空字符串。在非锁定模式中,只会立即返回尽可能的数据
f.write(bytes) 使用一次系统调用写入一个字节字符串或者字节数组。返回实际写入的字节数----这可能小于所提供的字节数.

有一点需要强调,即FileIO对象时低级别对象,它基于read()和write()之类的操作系统调用提供了一个十分薄弱的层。特别的,此对象用户需要经常剑侠返回代码,因为无法保证f.read()和f.write()操作时否会读取或者写入所有请求的数据。fcntl模块可用于改变文件的底层操作,比如文件锁定、阻塞行为,等等。

三、简单示例

1.简单的文件读取

def read_file():
    '''
    读取文件内容最简单的方式
    :return:读取到的文件内容
    '''
    path = 'files/demo_file.cfg'
    f = open(path, 'rb', buffering=0)
    f_read = f.read()
    return f_read

2.以生成器方式读文件

def read_file_generator():
    '''
    通过生成器的方式每次读取512字节数据
    :return: 生成器对象
    '''
    chunk_size = 512
    path = 'files/demo_file.cfg'
    with open(path, 'rb') as f:
        while True:
            c = f.read(chunk_size)
            if c:
                yield c
            else:
                break
    return c

3.简单写文件操作

def write_file(file):
    path = 'files/demo_file_write.cfg'
    f_write = open(path, 'wb+')
    for f in file:
        f_write.write(f)
    f_write.close()

demo下载

参考文档:python参考手册(第四版)


沧海为霜|豫ICP备16016402号