python的io模块实现了多种形式的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相关。这个层次的核心对象是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模块可用于改变文件的底层操作,比如文件锁定、阻塞行为,等等。
def read_file():
'''
读取文件内容最简单的方式
:return:读取到的文件内容
'''
path = 'files/demo_file.cfg'
f = open(path, 'rb', buffering=0)
f_read = f.read()
return f_readdef 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 cdef 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()