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)

Python中IO概述的更多相关文章

  1. python中IO多路复用、协程

    一.IO多路复用 IO多路复用:检测多个socket是否已经发生变化(是否已经连接成功/是否已经获取数据)(可读/可写) import socket def get_data(key): client ...

  2. Python中IO编程-StringIO和BytesIO

    Python在内存中读写数据,用到的模块是StringIO和BytesIO StringIO >>> from io import StringIO >>> f = ...

  3. Python中io的open()在PyCharm环境下报错和路劲的问题

    PS:我也是初学者,上班空闲时间学习学习Python.今天学到io的时候,遇到了两个用PyCharm环境编写代码的小白错误,如下: 两个问题都是如下代码: 1. 第一个问题:当写好代码之后,点击运行报 ...

  4. 第9.11节 Python中IO模块文件打开读写操作实例

    为了对前面学习的内容进行一个系统化的应用,老猿写了一个程序来进行文件相关操作功能的测试. 一. 测试程序说明 该程序允许测试人员选择一个文件,自己输入文件打开模式.写入文件的位置以及写入内容,程序按照 ...

  5. 第9.10节 Python中IO模块其他文件操作属性和方法简介

    本文中所有案例中的fp都是使用open函数打开文件返回的一个文件对象,为了节省篇幅,大部分没有提供文件打开的代码. 一. 文件是否关闭的属性 属性名:closed 功用:判断文件是否关闭 示例: &g ...

  6. [译]Python中的异步IO:一个完整的演练

    原文:Async IO in Python: A Complete Walkthrough 原文作者: Brad Solomon 原文发布时间:2019年1月16日 翻译:Tacey Wong 翻译时 ...

  7. python中的IO多路复用

    在python的网络编程里,socetserver是个重要的内置模块,其在内部其实就是利用了I/O多路复用.多线程和多进程技术,实现了并发通信.与多进程和多线程相比,I/O多路复用的系统开销小,系统不 ...

  8. python中的IO操作

    python中的基本IO操作: 1) 键盘输入函数:raw_input(string),不作处理的显示,与返回. input(string),可以接受一个python表达式作为返回,python内部得 ...

  9. 快速入门Python中文件读写IO是如何来操作外部数据的?

    读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘, ...

随机推荐

  1. QQ空间、新浪微博、腾讯微博等一键分享API链接代码

    1.新浪微博:http://service.weibo.com/share/share.php?url= count=表示是否显示当前页面被分享数量(1显示)(可选,允许为空)&url=将页面 ...

  2. [20181214]open file using O_DIRECT.txt

    [20181214]open file using O_DIRECT.txt --//因为一个测试需要,需要写一个测试小例子,验证使用O_DIRECT打开文件每次都是从磁盘读取.--//没想到浪费1个 ...

  3. [20170606]11G _optimizer_null_aware_antijoin.txt

    [20170606]11G _optimizer_null_aware_antijoin.txt --//上午测试_optimizer_null_aware_antijoin,发现自己不经意间又犯了一 ...

  4. linux源

    系统:centos7 x86_64 一.配置本地yum源 1.1加载光驱 1.2挂载到系统 注:如果要长期使用最好把整个镜像文件拷贝到系统下 1.3配置文件 路径/etc/yum.repos.d/ 打 ...

  5. 安全之路 —— 使用Windows全局钩子打造键盘记录器

    简介 键盘记录功能一直是木马等恶意软件窥探用户隐私的标配,那么这个功能是怎么实现的呢?在Ring3级下,微软就为我们内置了一个Hook窗口消息的API,也就是SetWindowsHookEx函数,这个 ...

  6. LeetCode算法题-N-ary Tree Level Order Traversal(Java实现)

    这是悦乐书的第225次更新,第238篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第92题(顺位题号是429).给定n-ary树,返回其节点值的级别顺序遍历.(即,从左到 ...

  7. Ecto 总结

    ecto 简介 ecto 相当于 elixir 的 ORM,但是得益于 elixir 语言,和传统的 ORM 相比,更加简洁和强大. ecto 主要分为 4 部分: Repo: 这是和真正数据库交互的 ...

  8. MATLAB求马氏距离(Mahalanobis distance)

    MATLAB求马氏距离(Mahalanobis distance) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1.马氏距离计算公式 d2(xi,  ...

  9. vue项目,ie11 浏览器报 Promise 未定义的错误

    报错:  {description: "“Promise”未定义", message: "“Promise”未定义", name: "Referenc ...

  10. LDAP安装配置(windows)

    目录 概述 测试环境 安装过程 配置启动 客户端介绍 多级DC的ldif文件的配置 [一].概述 什么叫LDAP呢,概念的东西这里就不多讲了,网上搜索下有很多,本文的重点是介绍如何在windows平台 ...