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对象得到:(其中的some initial text data 保存在内存中,而不是硬盘的文件中)

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)

 引申:python中改变标准输出编码的方式:

  

在做接口request时可能会遇到以下问题:

UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 0: illegal multibyte sequence

出现以上问题是由于编码的问题,使用以下方法可以改变Python标准输出的默认编码:

1、sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')            #改变标准输出默认编码为utf-8

修改了python的默认编码为utf8,并赋予了我们的stdout输出,使得python的输出默认编码为utf8

2、sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')    #改变标准输出默认编码为gb18030(gbk)
修改了python的默认编码为gb18030(gbk),并赋予了我们的stdout输出,使得python的输出默认编码为gb18030(gbk)

最新文章

  1. 基于DevExpress实现对PDF、Word、Excel文档的预览及操作处理
  2. Jquery ui widget开发
  3. 100个高质量Java开发者博客
  4. springmvc跳转的几种方式
  5. 【转】【SEE】基于SSE指令集的程序设计简介
  6. 【UVA 11401】Triangle Counting
  7. Java中正则表达式的使用
  8. HLS入门收集(1)
  9. 【Linux】Shell脚本编程(一)
  10. Cassandra1.2文档学习(2)——节点间通信协议之gossip协议
  11. windows phone 之ListBox模板选择
  12. 如何解决Bluetooth系统设计的棘手问题
  13. 初识mongo
  14. vue 路由懒加载 使用,优化对比
  15. itext实现pdf自动定位合同签订
  16. vue和echarts 封装的 v-charts 图表组件
  17. 集合框架map_DAY18
  18. Postman入门之Mock测试
  19. Oracle数据库中的分页--rownum
  20. C# 生成缩略图 去除图片旋转角度

热门文章

  1. mssql sqlserver 验证整型函数分享
  2. SqlServer通用存储过程
  3. centos7 多网卡绑定bond0 之mod4
  4. LeetCode算法题-Implement Queue Using Stacks(Java实现)
  5. Spring容器技术内幕之BeanWrapper类介绍
  6. Java多线程(三)如何创建线程
  7. python requests简介
  8. 监听器的配置,绑定HttpSessionListener监听器的使用
  9. 一、tars简单介绍 二、tars 安装部署资料准备
  10. [容斥原理] hdu 4135 Co-prime