IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    caimouse发表于 2016-06-23 13:33:23
    love 0

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

    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  深圳



沪ICP备19023445号-2号
友情链接