Python中IO概述
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概述的更多相关文章
- python中IO多路复用、协程
一.IO多路复用 IO多路复用:检测多个socket是否已经发生变化(是否已经连接成功/是否已经获取数据)(可读/可写) import socket def get_data(key): client ...
- Python中IO编程-StringIO和BytesIO
Python在内存中读写数据,用到的模块是StringIO和BytesIO StringIO >>> from io import StringIO >>> f = ...
- Python中io的open()在PyCharm环境下报错和路劲的问题
PS:我也是初学者,上班空闲时间学习学习Python.今天学到io的时候,遇到了两个用PyCharm环境编写代码的小白错误,如下: 两个问题都是如下代码: 1. 第一个问题:当写好代码之后,点击运行报 ...
- 第9.11节 Python中IO模块文件打开读写操作实例
为了对前面学习的内容进行一个系统化的应用,老猿写了一个程序来进行文件相关操作功能的测试. 一. 测试程序说明 该程序允许测试人员选择一个文件,自己输入文件打开模式.写入文件的位置以及写入内容,程序按照 ...
- 第9.10节 Python中IO模块其他文件操作属性和方法简介
本文中所有案例中的fp都是使用open函数打开文件返回的一个文件对象,为了节省篇幅,大部分没有提供文件打开的代码. 一. 文件是否关闭的属性 属性名:closed 功用:判断文件是否关闭 示例: &g ...
- [译]Python中的异步IO:一个完整的演练
原文:Async IO in Python: A Complete Walkthrough 原文作者: Brad Solomon 原文发布时间:2019年1月16日 翻译:Tacey Wong 翻译时 ...
- python中的IO多路复用
在python的网络编程里,socetserver是个重要的内置模块,其在内部其实就是利用了I/O多路复用.多线程和多进程技术,实现了并发通信.与多进程和多线程相比,I/O多路复用的系统开销小,系统不 ...
- python中的IO操作
python中的基本IO操作: 1) 键盘输入函数:raw_input(string),不作处理的显示,与返回. input(string),可以接受一个python表达式作为返回,python内部得 ...
- 快速入门Python中文件读写IO是如何来操作外部数据的?
读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘, ...
随机推荐
- 最新的windows xp sp3序列号 xp序列号
最新的windows xp sp3序列号(绝对可通过正版验证) MRX3F-47B9T-2487J-KWKMF-RPWBY(工行版) 可用(强推此号) QC986-27D34-6M3TY-JJXP9- ...
- C#核心基础--类的声明
C#核心基础--类的声明 类是使用关键字 class 声明的,如下面的示例所示: 访问修饰符 class 类名 { //类成员: // Methods, properties, fields, eve ...
- 以太坊之——golang以太坊接口调用
Go语言具有简单易学.功能强大,可跨平台编译等众多优势,所以这里选择以Go语言切入以太坊. 开始之前需要以下环境: Ubuntu(这里以ubuntu16.04为例) geth Ubuntu16.04安 ...
- Gson解析泛型
1.简单对象我们传入对象Class来将JSON字符串转为对象 private static <T> T fromJson(String result, Class<T> cla ...
- jdk8新特性表达式1
Jdk8中有好多新的特性,比如引入Lambda,简化代码的书写等等 我们先看一个关于Lambda的使用 /*** 输出list */@Testpublic void test() { String[] ...
- 监控MySQL或Web服务是否正常
在工作中,我们往往利用脚本定时监控本地.远端数据库服务端或Web服务是否运行正常,例如:负载高.cup高.连接数满了等.... 方法一:根据端口 本地:netstat/ss/lsof ① nets ...
- Shell脚本中的 测试开关 和 特殊参数
1. 测试开关 Shell中自带的一些测试指令, 下表列出这些测试指令的含义以及是否可用于 test命令, bash, ksh. 开关 test bash ksh 定义 -a FILE 支持 支持 ...
- Java strictfp
strictfp关键字 用于强制Java中的浮点计算(float或double)的精度符合IEEE 754标准. 不使用strictfp:浮点精度取决于目标平台的硬件,即CPU的浮点处理能力. 使用s ...
- 在Linux上编译Hadoop-2.4.0实践与总结
问题导读: 1.编译源码前需要安装哪些软件? 2.安装之后该如何设置环境变量? 3.为什么不要使用JDK1.8? 4.mvn package -Pdist -DskipTests -Dtar的作用是什 ...
- 设计模式のAbstractFactory(虚拟工厂)----创建模式
一.产生背景 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最 ...