Python IO编程

image

IO 在编程语言中特指输入和输出「即 input 和 output」。在 IO 编程中 stream (流)是一个重要的概念,一个完整的 IO 操作通常含有 input 和 output 两个数据流,我们称之为输入流和输出流。

由于 CPU 和内存的速度远远超过外设的速度,因此 IO 操作通常分为同步和异步两种方式,我们生活中所使用的操作系统通常情况下设计到 IO 操作的均使用的是异步 IO。那么同步 IO 和异步 IO 的区别是什么

  1. 同步 IO:即在遇到外设读取数据时,CPU 停止后续代码的执行,等待 IO 读取完成在接着执行剩余的代码。
  2. 异步 IO:即在遇到外设读取数据时,CPU 继续执行其他的代码,待 IO 读取完成在返回处理相关数据。

同步 IO 和异步 IO 最大的区别在遇到外设长时间读取数据时,CPU 是否等待 IO 的执行结果。

异步 IO 的性能远远高于同步 IO,但异步 IO 的复杂度远远高于同步 IO。操作 IO 的能力都是由操作系统提供的,每一种编程语言都会讲操作系统提供的接口进行封装以方便使用。

在 python 中常用的 IO 操作有文件读写、内存读写等。

文件读写

文件的读写是最常用的操作,Python 中内置了操作文件的函数,在使用方法上与 C 语言是兼容的。在现代操作系统上读写文件的功能都是由操作系统提供的,Python 中的文件读写实际上是对操作系统提供的一个文件对象的读写。

在 Python 中操作文件的函数主要有打开文件、读文件、写文件、关闭文件。
打开文件的函数如下:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
    Open file and return a corresponding file object. If the file cannot be opened, an OSError is raised.

open 函数的 mode 的设置值有以下几种

Character Meaning
'r' open for reading (default)
'w' open for writing, truncating the file first
'x' open for exclusive creation, failing if the file already exists
'a' open for writing, appending to the end of the file if it exists
'b' binary mode
't' text mode (default)
'+' open a disk file for updating (reading and writing)
'U' universal newlines mode (deprecated)

读文件的函数如下:

os.read(fd, n)
    Read at most n bytes from file descriptor fd.

    Return a bytestring containing the bytes read. If the end of the file referred to by fd has been reached, an empty bytes object is returned.

写文件的函数如下:

os.write(fd, str)
    Write the bytestring in str to file descriptor fd.

    Return the number of bytes actually written.

关闭文件的函数如下:

fileinput.close()
    Close the sequence.

    The class which implements the sequence behavior provided by the module is available for subclassing as well:

在对一个文件进行操作之前,必须先使用打开文件,以获取文件对象。下面是一个完整的文件读写程序

#!/usr/bin/env python3
#-*- coding:utf-8 -*-
f = open('test', 'w+')
f.write('hello world!')
print(f.read())
f.close()

以上代码在运行时没有任何的输出,这是由于使用 open 函数的 mode 参数仅仅设置为写模式,让我们对以上代码进行修改在进行运行

#!/usr/bin/env python3
#-*- coding:utf-8 -*-
f = open('test', 'w')
f.write('hello world!')
f.close()
f = open('test', 'r')
print(f.read())
f.close()

此时在次运行上面的代码,我们可以看到控制台输出了hello world!

文件读写的过程中不可避免的会出现 IOError, 当出现错误后面的代码就不会执行,如果按我们以上的代码执行,不可避免的会造成文件没有正常关闭会使系统重复生成文件对象浪费资源,为了保证能够正常关闭文件,我们可以使用 try...finally 来实现。我们将以上代码进行修改如下

#!/usr/bin/env python3
#-*- coding:utf-8 -*-
try:
    f = open('test', 'w')
    f.write('hello world!')
finally:
    if f:
        f.close()

try:
    f = open('test', 'r')
    print(f.read())
finally:
    if f:
        f.close()

以上代码虽然解决了文件不能正常关闭的问题,但是我们却为此编写了大量的 try...finally 代码,看起来也不是很美观,没关系,python 为我们准备 with 关键字来解决以上问题,

#!/usr/bin/env python3
#-*- coding:utf-8 -*-

with open('test', 'w') as f:
    f.write('hello world!')

with open('test', 'r') as f:
    print(f.read())

现在看起来是不好多了。

内存读写

python 通过 StringIO 和 BytesIO 来读写内存中的数据。StringIO 顾名思义就是读写内存中的字符串。BytesIO 用来读写内存中的二进制数据。

以下是 StringIO 的简单实用示例

#!/usr/bin/env python3
#-*- coding:utf-8 -*-
import io

f = io.StringIO()
f.write("hello world!")
print(f.getvalue())

以下是 BytesIO 的简单实用示例

#!/usr/bin/env python3
#-*- coding:utf-8 -*-
import io

f = io.BytesIO()
f.write('keinYe')
print(f.getvalue())
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 本系列主要学习Python的基本使用和语法知识,后续可能会围绕着AI学习展开。Python3 (1) Python...
    猿来如痴阅读 1,833评论 0 1
  • 本篇文章将介绍python里面的I/O编程。更多内容请参考:python学习指南 I/O编程 读写文件时最常见的I...
    小七奇奇阅读 587评论 0 2
  • 同步IO与异步IO:由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,就存在速度严重不匹配的问题。举个...
    DramaScript阅读 544评论 0 0
  • IO在计算机中指Input/Output,也就是输入和输出 同步和异步的区别就在于是否等待IO执行的结果。 文件读...
    云木杉阅读 202评论 0 0
  • IO编程概念 IO在计算机中指Input/Output,也就是输入和输出。由于程序和运行时数据是在内存中驻留,由C...
    时间之友阅读 720评论 0 0