13.2.5 I/O类的抽象和基本功能

来源:互联网 发布:头发怎么做酱油知乎 编辑:程序博客网 时间:2024/06/05 11:56

13.2.5 I/O类的抽象和基本功能

I/O类在这里根据不同的功能需要,抽象成不同的类,并且形成一个继承关系的类层次结构,先抽象一个基类,然后再派生类来实现不同的功能。所有I/O类的基类是IOBase类,它定义了流的基本接口,但它并没有分开实现读和写的功能,如果不想支持读取的功能,就可以不实现它函数即可,并且抛出异常UnsupportedOperation

RawIOBaseBufferedIOBaseTextIOBase都继承类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)

bytesbytearray的对象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)

bytesbytearray的对象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)

写入bytesbytearray对象b到缓冲区。

 

class io.BufferedRandom(raw, buffer_size=DEFAULT_BUFFER_SIZE)

随机访问缓冲区的接口类,它继承了类 BufferedReaderBufferedWriter,支持函数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是具体位置;参数whenceSEEK_SETSEEK_CURSEEK_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  深圳

0 0
原创粉丝点击