python io_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)

1607341-20190225103709516-2053390621.png

引申: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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值