I/O类在这里根据不同的功能需要,抽象成不同的类,并且形成一个继承关系的类层次结构,先抽象一个基类,然后再派生类来实现不同的功能。所有I/O类的基类是IOBase类,它定义了流的基本接口,但它并没有分开实现读和写的功能,如果不想支持读取的功能,就可以不实现它函数即可,并且抛出异常UnsupportedOperation。
类RawIOBase、BufferedIOBase、TextIOBase都继承类IOBase,类RawIOBase是实现对字节流进行读写;类BufferedIOBase是对原始数据读取并带有缓冲区功能;类TextIOBase是对字节数据进行读取,并通过编码和解码方式把这些二进制数据转换为文本字符串表示。
class io.IOBase
类IOBase是所有I/O类的基类,它实际上是字节流对象抽象,没有构造函数。它实现了迭代协议,所以支持对流进行迭代访问。它也实现对with语句的支持,可以通过with语句来进行合适地关闭。
close()
强制写入和关闭流对象。一旦对象关闭,再访问时就会抛出异常ValueError。
closed
如果文件流已经关闭,就返回True。
fileno()
如果文件流已经打开,就返回文件流对应的文件句柄,一个整数表示。
flush()
强制缓冲区里的数据写入到文件流。
isatty()
如果流是交互式的返回True,否则返回False。
readable()
如果流是可读取的,返回True,否则返回False。
readline(size=-1)
从流里读取一行数据并返回。如果大小有指明,以最接近size大小的一行数据返回。二进制模式时以b‘\n’作为行结束符;文本方式由open()中参数指定。
readlines(hint=-1)
从流里读取多行,并以列表的形式返回。参数hint是控制多少个行被读取。目前基本上都是使用for line in file:...方式来读取,不再采用本函数。
seek(offset, whence=SEEK_SET)
通过参数offset来改变流读写位置。参数whence可以下面参数:SEEK_SET表示开始位置;SEEK_CUR表示当前位置;SEEK_END表示结束位置。
seekable()
如果流支持随机访问,返回True;否则返回False 。
tell()
返回当前流所在位置。
truncate(size=None)
根据参数size来重新调整流的大小。
writable()
如果流支持可写,返回True,否则返回False。
writelines(lines)
写入一个多行数据的列表到流里。
class io.RawIOBase
原始二进制数据处理的I/O基类。它继承类 IOBase,基本上就是直接调用操作系统或API的函数,没有做更多的封装的功能。
read(size=-1)
从对象里读取size大小的字节数据,并返回。当没有指明大小或者为-1时,就是读取所有数据返回。
readall()
从流里读取所有数据,直到EOF标志结束,返回所有读取的数据。
readinto(b)
读取len(b)个长度数据到bytearray对象b里。
write(b)
写bytes或bytearray的对象b到文件流,返回写入字节的个数。
class io.BufferedIOBase
支持缓存的二进制输入输出基类,它继承类IOBase。与类RawIOBase区别是read(),readinto()和write()将会读取或写入多于调用的数据,也就是说读取时,本来要读取1K的,会根据缓冲区的大小来读取多于1K的大小。
raw
它是一个RawIOBase的一个实例。
detach()
分离流与缓冲区的关系,并返回流对象。
read(size=-1)
read1(size=-1)
读取size字节大小的数据,read1()至少调用一次原始的read()函数。
readinto(b)
读取len(b)个长度的数据到bytearray的对象b里。
write(b)
把bytes或bytearray的对象b写入到IO。
class io.FileIO(name, mode='r', closefd=True, opener=None)
FileIO是一个OS底层级别的bytes数据的抽象类,它实现了RawIOBase的接口。参数name是文件参数,可以是字符串或bytes表示的文件路径,或者是一个数字表示的文件句柄。参数mode是打开的模式,可以使用'r', 'w', 'x','a' ;参数closefd是表示使用完之后,是否关闭文件;参数opener是指定打开文件的可调用对象,主要使用参数(name, flags)。
此类提供了两个主要属性:
mode
文件IO打开的模式,保存构造函数输入的值。
name
文件名称,保存构造函数输入的文件参数。
class io.BytesIO([initial_bytes])
使用内存缓冲区实现的IO操作,它继承类BufferedIOBase。参数initial_bytes是包含可选的初始化bytes数据。
getbuffer()
返回一个缓冲区方式可读写的视图对象,它使用了共享的方式,不用拷贝数据。
例子:
#python 3.4
import io
b = io.BytesIO(b'http://blog.csdn.net/caimouse')
view = b.getbuffer()
print(b.getvalue())
view[2:6] = b'5612'
print(b.getvalue())
结果输出如下:
b'http://blog.csdn.net/caimouse'
b'ht5612/blog.csdn.net/caimouse'
getvalue()
返回bytes表示的缓冲区内容。
read1()
在这里,它的作用与read()函数一样。
class io.BufferedReader(raw, buffer_size=DEFAULT_BUFFER_SIZE)
本类实现缓冲式读取数据,当需要读取时,它把大量的数据从原始流里读取出来,放到内部缓冲区,然后再提供给外面访问者来读取。它是继承类BufferedIOBase。参数raw是输入一个可读的流对象;参数buffer_size是指内存缓存多大的数据。
peek([size])
查看数据,但不移动文件读取位置指针,返回bytes对象包括读取的数据。
read([size])
读取数据,并返回bytes对象,移动文件读取位置指针。如果size没有给出或者是负值,一直读取到文件结束符EOF为止。
read1(size)
读取并返回size大小的数据,但只调用一次原始读取函数从流里读取。
class io.BufferedWriter(raw, buffer_size=DEFAULT_BUFFER_SIZE)
提供可写的缓冲区类,它继承类BufferedIOBase。当向它写入数据时,它先把数据保存在内部缓冲区,直到满足下面其中一个条件才会写到原始流里:
l 当内部缓冲区不能再接收写入的数据时
l 当调用函数flush()
l 当调用函数seek()
l 当BufferedWriter对象被关闭或删除时
flush()
强制保存在缓冲区里的数据写入原始流对象。
write(b)
写入bytes或bytearray对象b到缓冲区。
class io.BufferedRandom(raw, buffer_size=DEFAULT_BUFFER_SIZE)
随机访问缓冲区的接口类,它继承了类 BufferedReader和 BufferedWriter,支持函数seek()和tell()操作。
class io.BufferedRWPair(reader, writer, buffer_size=DEFAULT_BUFFER_SIZE)
包含两个独立的RawIOBase对象,一个用来读取,一个用来写入,它继承类BufferedIOBase。
class io.TextIOBase
文本流的基类,提供了基于字符和以行为分隔的流I/O操作。它没有函数readinto()的操作,因为Python里的字符串对象是不能修改的。
encoding
编码器的名称。
errors
解码器或者编码器的错误设置。
newlines
可以设置为字符串、字符串元组或None,表示换行符。
buffer
TextIOBase类处理的二进制缓冲。
detach()
删除TextIOBase使用的二进制缓冲区,并返回它。
read(size)
从流里读取size个字符的字符串返回。如果参数size是负值或None,直读取到EOF结束。
readline(size=-1)
读取数据直遇到换行符或者文件结束符EOF.
seek(offset, whence=SEEK_SET)
改流的文件指针的位置。参数offset是具体位置;参数whence是SEEK_SET、SEEK_CUR、SEEK_END等。
tell()
返回当前文件指针所在的位置长度。
write(s)
写字符串对象s到流里,返回写入多少个字符。
class io.TextIOWrapper(buffer, encoding=None, errors=None, newline=None, line_buffering=False, write_through=False)
带有缓冲的文本I/O操作类,它继承类TextIOBase。参数encoding是类里编码和解码的名称;参数errors是选择编码或解码出错时的处理方式;参数newline是控制换行符由什么组成,比如空格、‘\n’、‘\r’、‘\r\n’;参数line_buffering设置为True时,当碰到有换行符时,就立即调用函数flush();参数write_through设置为True时,函数write()不缓冲写入的数据,直接写入流。
line_buffering
是否行缓冲区起作用。
class io.StringIO(initial_value='', newline='\n')
文本I/O基于内存的操作类。缓冲区可以设置为initial_value的初始值;参数newline是可以设置换行的标志。它继承类TextIOBase。
getvalue()
返回整个对象包含的字符串内容。当close()函数调用之后,不再返回任何内容。
例子:
#python 3.4
import io
output = io.StringIO()
output.write('First line.\n')
print('Second line.', file=output)
contents = output.getvalue()
output.close()
在I/O操作中,二进制I/O是效率最高的,比文本I/O要快,因为文本的I/O需要进行编码和解码。类FileIO是线程安全的类,二进制I/O操作类也是线程安全的,不过类TextIOWrapper不是线程安全的。
蔡军生 QQ:9073204 深圳