您的位置:首页 > 编程语言 > Python开发

Python中IO概述

2017-05-28 21:18 465 查看
  Python中的io模块是用来处理各种类型的I/O操作流。主要有三种类型的I/O类型:文本I/O(Text I/O),二进制I/O(Binary I/O)和原始I/O(Raw I/O)。它们都是通用类别,每一种都有不同的后备存储。属于这些类别中的任何一个的具体对象称为文件对象,其他常用的术语为流或者类文件对象。

  除了它的类别,每一种具体的流对象也具有各种功能:它仅仅允许读,或者仅仅允许写,或者既能读又能写。它也允许任意随机访问(向前或者向后寻找任何位置),或者仅仅顺序访问(例如在套接字或管道中)。

  所有的流对于提供给它们的数据的数据类型都很严格。例如,如果用一个二进制流的write()方法写一个字符类型的数据,那么将会触发一个TypeError错误。用文本流的write()方法来写字节对象数据也是一样的,会触发该错误。

Text I/O

  Text I/O期望输入和产生的是字符对象。这意味着无论何时,本地存储都是存储字节组(比如在文件中),数据的编码和解码是透明的,特定平台中换行符字符的翻译也是透明的(windows下换行翻译为:\r\n,而linux中为\n,mac中则又不同,但是这些跨平台的换行符Text I\O会自动根据操作系统平台来转换)。

  最简单的创造文本流的方法就是用open()函数,指定编码格式是可选的。

f  = open("myfile.txt", "r", encoding = "utf-8")


  内存中的文本流也可以通过StringIO对象得到:

f = io.StringIO("some initial text data")


  文本流的api细节描述在文档中的TextIOBase部分。

Binary I/O

  Binary I/O希望输入的是类字节对象,创造的是字节组对象。不会执行编码,解码和换行符转换操作。这种类型的流可以用于各种无文本数据,或者还需要手动控制的正在处理的文本数据时。

  最简单的构造二进制流的方法就是用open(),在模式串中加上’b’

f = open("myfile.jpg", "rb")


  内存中的二进制流也可以用BytesIO对象来创造:

f = io.BytesIO(b"some initial binary data: \x00\x01")


  二进制流api详细的描述细节在文档中的BufferedIOBase部分。

  其他库模块可能提供一些额外的方法来创造文本流或二进制流。例如socket.socket.makefile()

Raw I/O

  原始I/O(也称为无缓冲I/O)通常用作二进制流和文本流的低级构造块。从用户代码中直接操作原始流的用法很少见。然而,你可以通过用二进制模式打开一个文件并禁用缓存来构造一个原始流:

f = open("myfile,jpg", "rb", buffering = 0)


  关于原始流api的具体细节描述在RawIOBase文档部分。

高级模块

io默认缓冲区大小:

  一个int类型数据指定了模块的缓冲区I\O类的默认缓冲区大小。如果可以的话,open()直接使用文件的块大小作为缓冲区大小(包含在os.stat()中)

io.open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True. open=None)


这是内置的open()函数的默认形式

In-memory sterams内存中的流

  也可以用个字符串或者类字节对象作为文件进行读和写操作。对于字符串StringIO可以被用作一个用文本模式打开的文件一样,BytesIO可以被用作一个用二进制模式打开的文件一样。两者都提供访问的完全的读写功能。

I/O操作的类层次结构

  在I/O操作最顶层的类是抽象基类IOBase。它定义了流的基本的接口。但是值得注意的是,IOBase中读取流和写入流是没有分开的。实现该基类时,如果给定的操作没有实现,则可以引发一个UnsupportedOperation错误。

  RawIOBase继承自IOBase。它处理的是从流中读取或者向流中写入字节,FileIO是RawIOBase的子类,为文件系统中的文件提供接口。

  BufferedIOBase处理原始字节流(RawIOBase)上的缓冲。它的子类有,bufferdWriter,BufferedReader,BufferedRWPair等带缓冲区的流,分别是可读的流,可写的流,既可读又可写的流。BufferedRandow提供了一个带缓冲区的接口给随机访问流。BufferedIOBase的另一个子类,BytesIO是内存中的字节流。

  TextIOBase是IOBase的另一个子类,处理文本形式的字节流,并且处理相应的对字符串的编码和解码操作。TextIOWrapper是从TextIOBase中继承而来,是为带缓冲区的原始流提供的带缓冲区的文本接口。最后,StringIO是内存中的文本流。

  参数名称不是规范的一部分,只有open()函数中的参数被用作关键字参数。

  下图总结了io模块提供的抽象基础类(abstract base classes)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: